gpt4 book ai didi

python - Python中Pickle的MemoryError

转载 作者:IT王子 更新时间:2023-10-28 23:37:24 24 4
gpt4 key购买 nike

我正在处理一些数据,并将结果存储在三个字典中,并使用 Pickle 将它们保存到磁盘。每个字典有 500-1000MB。

现在我正在加载它们:

import pickle
with open('dict1.txt', "rb") as myFile:
dict1 = pickle.load(myFile)

但是,我已经在加载我得到的第一本字典了:

*** set a breakpoint in malloc_error_break to debug
python(3716,0xa08ed1d4) malloc: *** mach_vm_map(size=1048576) failed (error code=3)
*** error: can't allocate region securely
*** set a breakpoint in malloc_error_break to debug
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 858, in load
dispatch[key](self)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1019, in load_empty_dictionary
self.stack.append({})
MemoryError

如何解决这个问题?我的电脑有 16GB 的 RAM,所以我发现加载 800MB 字典崩溃的情况很不寻常。我还发现不寻常的是保存字典时没有问题。

此外,我计划在未来处理更多数据,从而产生更大的字典(磁盘上 3-4GB),因此,如果有任何提高效率的建议,我们将不胜感激。

最佳答案

如果您的字典中的数据是 numpy 数组,则有一些包(例如 joblibklepto)可以有效地对大型数组进行 pickle ,因为 kleptojoblib 都了解如何为 numpy.array 使用最小状态表示。如果您没有 array 数据,我的建议是使用 klepto 将字典条目存储在多个文件(而不是单个文件)或数据库中。

查看我对一个非常相关的问题的回答 https://stackoverflow.com/a/25244747/2379433 ,如果您可以对多个文件而不是单个文件进行 pickle ,希望并行保存/加载您的数据,或者希望轻松尝试存储格式和后端以查看哪种最适合您的情况。另见:https://stackoverflow.com/a/21948720/2379433对于其他潜在的改进,这里也是:https://stackoverflow.com/a/24471659/2379433 .

正如上面的链接所讨论的,您可以使用 klepto -- 它使您能够使用通用 API 轻松地将字典存储到磁盘或数据库中。 klepto 还允许您选择存储格式(picklejson 等)--also HDF5 (或 SQL 数据库)是另一个不错的选择,因为它允许并行访问。 klepto 可以利用专门的 pickle 格式(如 numpy 的)和压缩(如果您关心大小而不是访问数据的速度)。

klepto 让您可以选择使用“all-in-one”文件或“one-entry-per”文件存储字典,还可以利用多处理或多线程——这意味着您可以从后端并行保存和加载字典项目。例如,请参阅上面的链接。

关于python - Python中Pickle的MemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28068872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com