我有一个用Python编写的程序,它基本上执行以下操作:
for j in xrange(200):
# 1) Compute a bunch of data
# 2) Write data to disk
1)大约需要2-5分钟
2)大约需要1分钟
注意,有太多的数据需要保存在内存中。
理想情况下,我想要做的是以一种避免CPU空闲的方式将数据写入磁盘。这在Python中是可能的吗?谢谢!
发布于 2013-04-25 20:33:06
您可以像这样尝试using multiple processes:
import multiprocessing as mp
def compute(j):
# compute a bunch of data
return data
def write(data):
# write data to disk
if __name__ == '__main__':
pool = mp.Pool()
for j in xrange(200):
pool.apply_async(compute, args=(j, ), callback=write)
pool.close()
pool.join()
pool = mp.Pool()
将创建一个工作进程池。默认情况下,工作进程的数量等于计算机拥有的CPU核心数量。
每个pool.apply_async调用都会对一个任务进行排队,以便由工作进程池中的一个工作进程运行。当worker可用时,它会运行compute(j)
。当worker返回值data
时,主进程中的一个线程运行回调函数write(data)
,其中data
是worker返回的数据。
一些注意事项:
j
。解决此问题的一种方法是将数据写入sqlite (或其他类型的)数据库,并将j
作为数据字段之一。然后,当您希望按顺序读取数据时,您可以SELECT * FROM table ORDER BY j
.池= mp.Pool(processes=1)
这将创建一个工作进程(运行compute
),让主进程运行write
。由于compute
比write
耗时更长,因此队列不会备份超过一个要写入磁盘的数据块。但是,您仍然需要足够的内存来计算一个数据块,同时将不同的数据块写入磁盘。
如果你没有足够的内存来同时做这两件事,那么你别无选择--你的原始代码,顺序地运行compute
和write
,是唯一的方法。
发布于 2013-04-25 20:29:15
你可以使用Queue.Queue
(模块在这里:Queue)和threading.Thread
(或者threading.start_new_thread
,如果你只是想要一个函数),模块在这里:threading -因为文件写入不是CPU密集型的,并且使用更多的IO。( GIL不会影响它)。
发布于 2013-04-25 20:40:28
简单的方法是只使用线程和队列。另一方面,如果计算部分不依赖于全局状态,并且您的计算机具有多个CPU核心,则更有效的方法是使用process pool
from multiprocessing import Pool
def compute_data(x):
return some_calculation_with(x)
if __name__ == '__main__':
pool = Pool(processes=4) # let's say you have quad-core, so start 4 workers
with open("output_file","w") as outfile:
for calculation_result in pool.imap(compute_data, range(200)):
# pool.imap returns results as they come from process pool
outfile.write(calculation_result)
https://stackoverflow.com/questions/16214736
复制相似问题