我正在尝试并行化一些现有代码。我希望一旦完成就保存每次迭代的输出,这样我就不必将整个循环存储在内存中。基本上是这样的:
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:
我目前不知道为什么我不能在循环中转储到pickle对象。我没有多处理(即只是一个for循环)尝试了这个代码,它工作得很好。
我还将这个功能移到了main()之外,然后传入了&#39; outf&#39;作为另一个论点。该方法在尝试写入已关闭的文件时出错。
当我的循环并行化时,如何将输出保存在pickle文件中?
答案 0 :(得分:0)
尝试同时访问同一文件句柄的线程会遇到问题。相反,您可以使用UIView
方法挑选列表,然后将组合的bytearray转储到最后的文件中。否则,您可以从每个进程中选择一个单独的文件句柄,因此每个进程都有一个文件。
此外,酸洗不是存储大量数据的理想方式。有特别设计的文件格式,如HDF5(http://www.h5py.org/),非常适合大量数字数据存储。 h5py实现非常成熟且易于使用,并且还允许您并行存储数据。