您可以像这样尝试
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 = \\ tmp.Pool()将创建一个工作进程池.默认情况下,工作器数等于计算机具有的CPU核心数.
每个pool.apply_async调用将由工作进程池中的工作程序运行的任务排队.当一个worker可用时,它运行compute(j).当worker返回一个值data时,主进程中的一个线程运行回调函数write(data),数据是worker返回的数据.
一些警告:
>数据必须是可选择的,因为它是从数据传输的
工人通过Queue返回主流程.
>无法保证工人完成的顺序
任务与任务发送到的任务顺序相同
池.因此,数据写入磁盘的顺序可能不会
对应于j范围从0到199.解决这个问题的一种方法
将数据写入sqlite(或其他类型)数据库
j作为数据领域之一.然后,当你想阅读
按顺序排列数据,你可以SELECT * FROM表ORDER BY j.
>使用多个进程将增加所需的内存量
因为数据是由工作进程生成的,等待写入磁盘的数据会累积在队列中.您
可能能够减少使用NumPy所需的内存量
阵列.如果那是不可能的,那么你可能不得不减少
进程数:
pool = mp.Pool(processes=1)
这将创建一个工作进程(运行计算),离开
运行写入的主要进程.由于计算需要更长时间
写,队列将不会备份超过一个块
要写入磁盘的数据.但是,您仍然需要足够的内存
在写一个不同的块时计算一个数据块
数据到磁盘.
如果你没有足够的内存来同时执行这两个操作,那么你别无选择 – 你的原始代码是运行计算和顺序写入的唯一方法.