无法在python中编写大文件

时间:2014-06-23 10:54:16

标签: python io multiprocessing large-files pickle

我有一个使用cPickle转储大(几GB)文件的程序。它似乎适用于较小的文件(它工作的最大文件是5.6 GB)但在较大的文件上无声地(!)失败。

不确定它是否相关,但我使用多处理同时在多个节点上生成和写入这些文件。我怀疑这个问题不是特定于(c)Pickle,因为我在尝试使用HDF5h4py中写出大文件时遇到类似问题。

知道可能会发生什么吗?

其他一些信息: 我在Linux上使用EXT4文件系统运行。我应该有足够的RAM(60 GB + 120 GB交换...没有MemoryError),每个进程都在一个单独的文件上工作。没有进程被杀死...我有一个循环,在每次迭代时计算一个大文件并转储它。如果文件太大,它就不会被转储,并且该过程继续循环的下一次迭代而没有任何错误消息或任何其他指示出错的地方(除了丢失的文件)。 / p>

这是一个重现行为的最小样本:

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)文件和以下错误消息(当我使用多处理运行时,我从未看到错误):

In [32]: cPickle.dump(test, open('/home/ctw/tmp/test.pickle','w'), -1)
---------------------------------------------------------------------------
SystemError                               Traceback (most recent call last)
<ipython-input-32-62283b59a617> in <module>()
----> 1 cPickle.dump(test, open('/home/ctw/tmp/test.pickle','w'), -1)

SystemError: error return without exception set

另一个更新:如果我使用0而不是-1作为协议,则会写入文件。

1 个答案:

答案 0 :(得分:0)

对于字节协议,Python的cpickle文件大小显然存在固有的限制,并且<3 of 2 ** 31-1。在多处理过程中没有错误信息仍然很烦人/奇怪。