【发布时间】:2014-06-23 10:54:16
【问题描述】:
我有一个程序使用cPickle 转储大型(几 GB)文件。它似乎适用于较小的文件(它适用的最大文件是 5.6 GB),但在较大的文件上会静默失败(!)。
不确定它是否相关,但我正在使用 multiprocessing 在多个节点上同时生成和写入这些文件。我怀疑这个问题并不特定于 (c)Pickle,因为我在尝试使用 h4py 在 HDF5 中写出大文件时遇到了类似的问题。
知道会发生什么吗?
一些附加信息: 我正在使用 EXT4 文件系统的 Linux 上运行。我应该有足够多的 RAM(60 GB + 120 GB 交换 ... 没有 MemoryError),并且每个进程都在一个单独的文件上工作。没有进程被杀死......我有一个循环,在每次迭代时计算一个大文件并将其转储。如果文件太大,它就不会被转储,并且该过程会继续循环的下一次迭代,而不会出现任何错误消息或任何其他表明出现问题的迹象(丢失的文件除外)。
这是重现该行为的最小示例:
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 作为协议,则会写入文件。
【问题讨论】:
-
回答这个问题将是一个猜测,因为它缺少信息,您可以尝试使用trace 运行您的进程,这可能会为您提供一些解决问题或发生位置的方向,如果您正在使用多处理尝试限制为 1 个进程(是的,这将需要更多时间),但它会告诉您进程之间是否存在冲突。
-
一些
file systems可能有大小限制 - 例如 FAT32 有 4GB 限制。 -
如果您使用的是 linux 系统,请确保您的 RAM 没有用完,因为系统可能正在终止进程
-
抱歉信息不足,感谢您迄今为止的回复。我正在使用 EXT4 文件系统的 Linux 上运行。我应该有足够多的 RAM(60 GB + 120 GB 交换 ... 没有 MemoryError),并且每个进程都在一个单独的文件上工作。没有进程被杀死......我有一个循环,在每次迭代时计算一个大文件并将其转储。如果文件太大,它就不会被转储,并且该过程会继续循环的下一次迭代,而不会出现任何错误消息或任何其他表明出现问题的迹象(丢失的文件除外)。
标签: python io multiprocessing large-files pickle