我有一个程序,它使用cPickle来转储大(几GB)文件。对于较小的文件(它处理的最大文件是5.6GB),它似乎可以正常工作,但会自动失败(!)在更大的文件上。在
不确定是否相关,但我正在使用多处理在多个节点上同时生成和写入这些文件。我怀疑这个问题并不是(c)Pickle特有的,因为我在尝试使用h4py在HDF5中写出大文件时遇到过类似的问题。在
你知道会发生什么吗?在
一些附加信息:
在Linux系统上运行extm 4'。我应该有足够的内存(60 GB+120 GB交换。。。没有内存错误),每个进程都在一个单独的文件上工作。没有进程被杀死。。。我有一个循环,它在每次迭代中计算一个大文件并将其转储。如果文件太大,它就不会被转储,并且进程将继续循环的下一次迭代,而没有任何错误消息或任何其他指示出错的指示(除了丢失的文件)。在
下面是一个复制行为的最小样本:import numpy as np
import cPickle
import multiprocessing as mp
def test():
test = np.random.random(1000000000)
# test = np.random.random(10000) # this works
cPickle.dump(test, open('/home/ctw/tmp/test.pickle','w'), -1)
po = mp.Pool(1)
po.apply_async(test)
po.close()
结果是创建一个空文件。当我在多处理环境外运行此程序时,通常的结果是创建一个小(127B)文件并显示以下错误消息(使用多处理运行此文件时,我从未看到错误):
^{pr2}$
另一个更新:如果我使用0而不是-1作为协议,文件将被写入。在