[英]Python: Pickle output for each iteration using multiprocessing
我正在尝试并行化一些现有代码。 我想在每次迭代完成后立即保存其输出,这样就不必将整个循环存储在内存中。 基本上是这样的:
import cPickle as pickle
from multiprocessing import Pool
if __name__ == '__main__':
outf = open('test_mp.pkl', 'wb')
def f(x):
pickle.dump([x, x*x], outf, -1)
return x*x
pool = Pool(4)
out = pool.map(f, range(100))
print out
该代码运行时没有错误或警告,并为'out'产生了正确的值。 但是,当我尝试读取生成的pickle文件时,似乎根本没有写入任何内容:
>>> f = open('test_mp.pkl', 'rb')
>>> pickle.load(f)
---------------------------------------------------------------------------
EOFError Traceback (most recent call last)
<ipython-input-4-4d7131bbd231> in <module>()
----> 1 pickle.load(f)
EOFError:
我现在不知为何为什么不能在循环中间将其转储到泡菜对象中。 我已经尝试过此代码而不进行多处理(即,只是一个for循环),并且效果很好。
我还将函数移到了main()之外,并将'outf'作为附加参数传入。 该方法给出有关尝试写入已关闭文件的错误。
当我的循环并行化时,如何将输出保存在pickle文件中?
线程试图同时访问相同的文件句柄时会遇到问题。 相反,您可以使用.dumps
方法将其放入列表中,然后将组合的.dumps
数组转储到最后的文件中。 否则,您可以将每个进程的腌制到单独的文件句柄中,因此每个进程将只有一个文件。
此外,酸洗不是存储大量数据的理想方法。 有专门设计的文件格式,例如HDF5( http://www.h5py.org/ ),非常适合于海量数字数据存储。 h5py实现非常成熟且易于使用,还可以允许您并行存储数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.