【发布时间】:2015-03-20 01:40:55
【问题描述】:
我正在处理一些数据,并将结果存储在三个字典中,并使用 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),因此我们非常感谢任何关于如何提高效率的建议。
【问题讨论】:
-
您使用的是什么操作系统? 磁盘上文件的大小还是你测量的实际内存使用量?
-
这取决于您的操作系统允许进程分配多少内存。
-
Size 是磁盘上的文件大小。我正在使用 Mac OS 10.10。有没有办法调整允许分配多少内存?
-
800MB 的数据不会转化为 800MB 的内存使用;它可能更大,也可能更小,但通常更大。您最初是如何制作这些泡菜的?
-
那么你的
dict1有多大?您必须递归使用sys.getsizeof()来获取该对象的内存占用。该占用空间取决于操作系统,以及您使用的是 32 位还是 64 位进程。
标签: python memory dictionary memory-leaks pickle