Python中使用Pickle的MemoryError

flo*_*otr 7 python memory dictionary memory-leaks pickle

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

现在我正在加载它们:

import pickle
with open('dict1.txt', "rb") as myFile:
    dict1 = pickle.load(myFile)
Run Code Online (Sandbox Code Playgroud)

但是,我已经在加载第一个字典了:

*** 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
Run Code Online (Sandbox Code Playgroud)

怎么解决这个?我的电脑有16GB的RAM,所以我觉得加载一个800MB的字典崩溃是不寻常的.我也发现不寻常的是在保存字典时没有问题.

此外,将来我计划处理更多数据,从而产生更大的词典(磁盘上3-4GB),因此任何有关如何提高效率的建议都值得赞赏.

Mik*_*rns 8

如果你在字典数据numpy阵列,还有包(如joblibklepto),使酸洗大数组效率,因为无论是kleptojoblib了解如何使用最少的状态表示的numpy.array.如果您没有array数据,我的建议是用于klepto将字典条目存储在多个文件(而不是单个文件)或数据库中.

请参阅我对一个非常密切相关的问题的答案/sf/answers/1767132321/,如果你可以腌制到几个文件而不是单个文件,想要并行保存/加载数据,或者我想轻松尝试一下存储格式和后端,看看哪种方式最适合您的情况.另请参阅:https://stackoverflow.com/a/21948720/2379433以获取其他可能的改进,此处也是:https://stackoverflow.com/a/24471659/2379433.

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

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