以迭代方式反序列化大文件导致我的depickler对象的大小膨胀。我还没有看到有关任何缓存或缓冲的任何文档。
summary.print_(summary.summarize(muppy.get_objects()))
print("now without depickler")
del unpickler
summary.print_(summary.summarize(muppy.get_objects()))
types| # objects | total size
============================| =========== | ============
<class list | 901745 | 949.67 MB
<class int | 13066478 | 348.91 MB
<class numpy.float64 | 4736882 | 144.56 MB
<class _pickle.Unpickler | 1 | 128.00 MB
<class float | 479569 | 10.98 MB
<class str | 55003 | 7.95 MB
<class dict | 8569 | 4.65 MB
<class type | 2196 | 2.23 MB
<class code | 16113 | 2.22 MB
<class sip.wrappertype | 649 | 669.28 KB
<class sip.enumtype | 544 | 561.00 KB
<class set | 1199 | 544.28 KB
<class tuple | 7649 | 512.05 KB
<class wrapper_descriptor | 5402 | 422.03 KB
<class weakref | 4365 | 341.02 KB
now without depickler
types| # objects | total size
==============================| =========== | ============
<class str | 55154 | 7.97 MB
<class dict | 8737 | 4.76 MB
<class type | 2196 | 2.23 MB
<class code | 16113 | 2.22 MB
<class list | 7018 | 842.15 KB
<class sip.wrappertype | 649 | 669.28 KB
<class sip.enumtype | 544 | 561.00 KB
<class set | 1199 | 544.28 KB
<class sip.methoddescriptor | 9699 | 530.41 KB
<class tuple | 7649 | 512.05 KB
<class wrapper_descriptor | 5403 | 422.11 KB
<class weakref | 4367 | 341.17 KB
<class getset_descriptor | 2810 | 197.58 KB
function (__init__) | 1394 | 185.14 KB
<class int | 5687 | 157.12 KB
理想情况下,如果我每次迭代都调用iteration = unpickler.load()
,它将重新分配iteration
。目前,我什至对结果都不做任何事情,因为我最初以为分析是罪魁祸首。因此,所有代码所做的工作都是不断地发送到iteration
中,直到达到70k,因为那一刻我达到了计算机的内存极限。好像unpickler类正在存储我的所有结果。
我在我的unpickler实例上运行了一个dir(),但没有看到有关缓存或清除或存储的任何信息。未设置Persistent_load。 unpickler.memo.clear()使对load()的下一次调用引发“ KeyError:2”。 C实现提到在读取对象时将其压入堆栈,但是还有很多弹出窗口,并且python代码看不到堆栈,因此,如果它们导致堆栈溢出,我将看不到它。