Python:使用多处理的每次迭代的Pickle输出

时间:2017-10-03 02:40:22

标签: python pickle python-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:

我目前不知道为什么我不能在循环中转储到pickle对象。我没有多处理(即只是一个for循环)尝试了这个代码,它工作得很好。

我还将这个功能移到了main()之外,然后传入了&#39; outf&#39;作为另一个论点。该方法在尝试写入已关闭的文件时出错。

当我的循环并行化时,如何将输出保存在pickle文件中?

1 个答案:

答案 0 :(得分:0)

尝试同时访问同一文件句柄的线程会遇到问题。相反,您可以使用UIView方法挑选列表,然后将组合的bytearray转储到最后的文件中。否则,您可以从每个进程中选择一个单独的文件句柄,因此每个进程都有一个文件。

此外,酸洗不是存储大量数据的理想方式。有特别设计的文件格式,如HDF5(http://www.h5py.org/),非常适合大量数字数据存储。 h5py实现非常成熟且易于使用,并且还允许您并行存储数据。