Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中带Pickle的MemoryError_Python_Memory_Dictionary_Memory Leaks_Pickle - Fatal编程技术网

Python中带Pickle的MemoryError

Python中带Pickle的MemoryError,python,memory,dictionary,memory-leaks,pickle,Python,Memory,Dictionary,Memory Leaks,Pickle,我正在处理一些数据,我将结果存储在三个字典中,并用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

我正在处理一些数据,我将结果存储在三个字典中,并用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),因此,任何关于如何提高效率的建议都值得赞赏。

这是pickle的固有问题, 其目的是与相当少量的 数据。字典的大小,当加载到内存中时, 比磁盘上大很多倍

加载100MB的pickle文件后,您可能会 大约1GB的字典。 网络上有一些计算开销的公式,但我只能推荐使用一些
像MySQL或PostgreSQL这样的像样的数据库可以存储如此多的数据

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

请参阅我对一个密切相关问题的回答,如果您对多个文件(而不是单个文件)的酸洗没有问题,您希望并行保存/加载数据,或者希望轻松试验存储格式和后端,以查看哪种最适合您的情况。另请参见:了解其他潜在的改进,这里也有:

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


klepot
为您提供了使用“一体式”文件或“每个文件一个条目”存储字典的选项,还可以利用多处理或多线程处理——这意味着您可以并行地将字典项保存到后端或从后端加载字典项。例如,请参阅上面的链接。

我建议您使用32位Python,并且它有4GB限制。您应该使用64位而不是32位。我已经试过了,我的pickle dict超过了1.7GB,除了时间变长之外,我没有遇到任何问题。

你在使用什么操作系统?大小是磁盘上的文件大小还是您测量了实际内存使用情况?这取决于您的操作系统允许进程分配多少内存。大小是磁盘上的文件大小。我正在使用MacOS10.10。有没有办法调整允许分配的内存量?800MB的数据不能转化为800MB的内存使用量;它可以更大,也可以更小,但通常更大。你最初是如何制作这些泡菜的?你的
dict1
有多大?您必须递归地使用以获取该对象的内存占用。如果您使用的是32位或64位进程,则该内存占用取决于操作系统。谢谢您的回答。我保留了pickle,但从根本上修改了代码,以生成占用空间小得多的numpy数组。现在它可以正常工作了。@Mike我正在使用熊猫的
mutliprocessing.Pool
。在
apply\u async
之后,如果pandas数据帧有点大,它会抛出MemoryError。我能用小偷来缓解这种情况吗?@MSS:如果没有更多细节,很难从你的问题中分辨出来。可能地Klepto可以将数据推送到磁盘上,从而将其移出内存,并为您提供一个一次访问部分数据的接口。根据您的用例,我希望
klepot
dask
可能会有所帮助。是的。。。我知道大小不相等,但我没想到这个比例可能是10倍……你能进一步澄清你的答案吗?怎么用?代码片段?当我尝试使用32位Python版本加载超过1.7GB的pickle dict数据时,它被阻塞了很长一段时间。但64位Python版本不会。