首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的MemoryError和Pickle

Python中的MemoryError和Pickle
EN

Stack Overflow用户
提问于 2015-01-21 21:51:01
回答 3查看 32.8K关注 0票数 13

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

现在,我用以下命令加载它们:

代码语言:javascript
复制
import pickle
with open('dict1.txt', "rb") as myFile:
    dict1 = pickle.load(myFile)

然而,在加载我得到的第一个字典时:

代码语言:javascript
复制
*** 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

如何解决这个问题?我的计算机有16 of的RAM,所以我发现加载800MB的字典崩溃是不寻常的。我还发现不寻常的是,在保存字典时没有任何问题。

此外,在未来,我计划处理更多的数据导致更大的字典(磁盘上3-4 4GB),所以任何如何提高效率的建议都将受到感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-21 22:21:38

如果字典中的数据是numpy数组,那么有一些包(如joblibklepto)可以使酸洗大型数组变得高效,因为kleptojoblib都知道如何对numpy.array使用最小状态表示。如果您没有array数据,我的建议是使用klepto将字典条目存储在多个文件中(而不是单个文件中)或存储到数据库中。

请看我对一个密切相关问题的回答https://stackoverflow.com/a/25244747/2379433,如果你可以选择多个文件而不是单个文件,想要并行保存/加载你的数据,或者想要轻松地试验存储格式和后端,看看哪个最适合你的情况。另请参阅:https://stackoverflow.com/a/21948720/2379433了解其他潜在的改进,也可在此处查看:https://stackoverflow.com/a/24471659/2379433

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

klepto为您提供了使用"all- in -one“文件或"one-entry-per”文件存储字典的选项,还可以利用多处理或多线程--这意味着您可以并行地将字典项保存到后端或从后端加载字典项。有关示例,请参阅上面的链接。

票数 11
EN

Stack Overflow用户

发布于 2015-01-21 22:04:24

这是pickle的一个固有问题,它的目的是用来处理相当少量的数据。当加载到内存中时,字典的大小比磁盘上的大许多倍。

在加载一个100MB的pickle文件之后,您很可能拥有一个大约1 1GB的字典。网上有一些计算开销的公式,但我只能推荐使用一些像样的数据库,比如MySQL或PostgreSQL来处理这样大量的数据。

票数 4
EN

Stack Overflow用户

发布于 2018-06-27 14:01:39

我建议你使用32位的Python,它有4 4GB的限制。您应该使用64位而不是32位。我已经尝试过了,我的酸洗字典超过了1.7 get,除了时间变长之外,我没有得到任何问题。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28068872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档