繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM