我有一个 Python 程序,基本上执行以下操作:
for j in xrange(200):
# 1) Compute a bunch of data
# 2) Write data to disk
1)大约需要2-5分钟
2) 大约需要~1分钟
请注意,内存中需要保存的数据太多。
理想情况下,我想做的是将数据写入磁盘,以避免 CPU 闲置。这在Python中可能吗?谢谢!
你可以尝试使用多个进程 http://docs.python.org/2/library/multiprocessing.html像这样:
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 核心的数量。
Each 池.apply_async http://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.apply_asynccall 将要由工作进程池中的工作线程运行的任务排队。当工作人员可用时,它就会运行compute(j)
。当worker返回一个值时,data
,主进程中的一个线程运行回调函数write(data)
, with data
是worker返回的数据。
一些注意事项:
- 数据必须是可挑选的,因为它是从
工作进程通过a返回到主进程Queue http://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes.
- 无法保证工作人员完成的顺序
任务的顺序与任务发送到的顺序相同
水池。所以数据写入磁盘的顺序可能不一样
相当于
j
范围从 0 到 199。解决此问题的一种方法
将数据写入 sqlite(或其他类型)数据库
和j
作为数据字段之一。那么当你想读书的时候
按顺序排列数据,您可以SELECT * FROM table ORDER BY j
.
-
使用多个进程会增加所需的内存量
因为数据是由工作进程生成的,等待写入磁盘的数据会累积在队列中。你
或许能够减少使用 NumPy 所需的内存量
数组。如果这是不可能的,那么您可能必须减少
进程数:
pool = mp.Pool(processes=1)
这将创建一个工作进程(运行compute
),留下
运行的主进程write
. Since compute
需要比write
,队列不会得到超过一大块的备份
要写入磁盘的数据。但是,您仍然需要足够的内存
计算一个数据块,同时写入另一块数据
数据到磁盘。
如果您没有足够的内存来同时执行这两项操作,那么您别无选择 - 您的原始代码将运行compute
and write
依次进行,是唯一的办法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)