64 位内存错误 Python?

MemoryError in 64-bit Python?

我在 Linux 上 运行ning 64 位 Python 3,我有一个代码可以生成包含大约 20,000 个元素的列表。当我的代码试图通过 pickle 模块将约 20,000 个二维数组的列表写入二进制文件时发生内存错误,但它生成了所有这些数组并将它们附加到此列表而没有问题。我知道这一定会占用大量内存,但我使用的机器有大约 100GB 可用空间(来自命令 free -m)。有错误的行:

with open('all_data.data', 'wb') as f:
    pickle.dump(data, f)
>>> MemoryError

其中 data 是我的 ~20,000 个 numpy 数组列表。此外,之前我试图 运行 这段代码包含大约 55,000 个元素,但是虽然将所有数组附加到 data 列表已经完成了 40%,但它只是输出 Killed 通过它自己。所以现在我试图将它分成几个部分,但这次我得到了一个 MemoryError。我怎样才能绕过这个?我还被告知我可以访问多个 CPU,但我不知道如何利用这些(我还不明白multiprocessing)。

Pickle 将尝试解析您的所有数据,并可能在将所有内容写入磁盘之前将其转换为中间状态 - 因此,如果您使用了大约一半的可用内存,它就会崩溃。

由于您的数据已经在列表中,一个简单的解决方法是 pickle 每个数组并存储它,而不是尝试一次序列化 20000 个数组:

with open('all_data.data', 'wb') as f:
    for item in data:
        pickle.dump(item, f)

然后,要读回它,只需从文件中取出对象并将其附加到列表中,直到文件耗尽:

data = []
with open('all_data.data', 'rb') as f:
    while True:
        try:
            data.append(pickle.load(f))
        except EOFError:
            break

这是有效的,因为从文件中取消选择的行为非常好:文件指针恰好停留在文件中存储的腌制对象结束的位置 - 因此进一步读取从下一个对象的开头开始。