【问题标题】:Silent failure to write large files in python在python中写入大文件的静默失败
【发布时间】:2014-06-23 10:54:16
【问题描述】:

我有一个程序使用cPickle 转储大型(几 GB)文件。它似乎适用于较小的文件(它适用的最大文件是 5.6 GB),但在较大的文件上会静默失败(!)。

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

知道会发生什么吗?

一些附加信息: 我正在使用 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


【解决方案1】:

显然,对于字节协议,Python

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-29
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多