开枪的高公羊使用率? (千兆字节)

时间:2019-07-11 19:05:13

标签: python python-3.x pickle

以迭代方式反序列化大文件导致我的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代码看不到堆栈,因此,如果它们导致堆栈溢出,我将看不到它。

0 个答案:

没有答案