Python 为什么asizeof.asizeof(xxxx)修复内存泄漏?

Python 为什么asizeof.asizeof(xxxx)修复内存泄漏?,python,memory,memory-leaks,Python,Memory,Memory Leaks,我正在尝试查找内存泄漏。当我运行程序时,内存使用会随着时间的推移而增加。几个小时后,它将达到15GB 在试图确定泄漏发生位置的过程中,我在主回路中添加了一条管线(最终运行了18000次): 我想这个变量可能会越来越大,所以我想随着时间的推移监控它的大小 令我惊讶的是,在我插入这段代码后,程序不再泄漏内存!它的运行时间延长了好几倍,但整个过程中内存使用量都保持在800MB以下 这是完全可复制的——如果我注释这段代码,内存使用会迅速增加,但是如果我取消注释它,那么显然内存问题就消失了 我还使用mup

我正在尝试查找内存泄漏。当我运行程序时,内存使用会随着时间的推移而增加。几个小时后,它将达到15GB

在试图确定泄漏发生位置的过程中,我在主回路中添加了一条管线(最终运行了18000次):

我想这个变量可能会越来越大,所以我想随着时间的推移监控它的大小

令我惊讶的是,在我插入这段代码后,程序不再泄漏内存!它的运行时间延长了好几倍,但整个过程中内存使用量都保持在800MB以下

这是完全可复制的——如果我注释这段代码,内存使用会迅速增加,但是如果我取消注释它,那么显然内存问题就消失了

我还使用muppy.print_summary()尝试识别泄漏发生的位置

当泄漏发生时,这是经过大约600次循环后的情况:

 types |   # objects |   total size
====== | =========== | ============
  dict |      788133 |    615.75 MB
  list |      274393 |     29.30 MB
 tuple |      255051 |     15.80 MB
 .....
 types |   # objects |   total size
 ===== | =========== | ============
  dict |       41481 |     39.44 MB
  list |       27925 |     10.83 MB
   set |       10615 |      3.97 MB
   str |       34373 |      3.00 MB
  code |       11848 |      1.45 MB
   int |       46761 |      1.07 MB
  type |        1179 |      1.02 MB
 tuple |        5553 |    582.78 KB
 .....
如果我让它继续运行,这些变量将不断增长,dict将很快处于GB范围内

当我取消对ashift行的注释时,这是经过2000次循环之后的样子:

 types |   # objects |   total size
====== | =========== | ============
  dict |      788133 |    615.75 MB
  list |      274393 |     29.30 MB
 tuple |      255051 |     15.80 MB
 .....
 types |   # objects |   total size
 ===== | =========== | ============
  dict |       41481 |     39.44 MB
  list |       27925 |     10.83 MB
   set |       10615 |      3.97 MB
   str |       34373 |      3.00 MB
  code |       11848 |      1.45 MB
   int |       46761 |      1.07 MB
  type |        1179 |      1.02 MB
 tuple |        5553 |    582.78 KB
 .....
我可以在2000次迭代后继续运行它,并且内存使用量基本保持不变。但如果没有这条ashift线,内存使用量将线性增加

我真的很困惑,为什么一个测量变量大小的调用实际上会影响程序的内存使用。似乎是海森堡测不准原理的一个版本


有人知道这是怎么发生的吗?Python2.7.5就是这样。

出于好奇,在循环中添加explisit垃圾收集建议是否可以解决问题?疯狂的猜测,但有可能你有一个循环引用,不知何故print语句允许GC收集。这也是我的想法,所以我在循环中添加了“GC.collect()”。它没有解决问题。我还尝试了“print('size:',asizeof.asizeof(yyyy))(不同的变量),但这并没有解决问题,所以“print”不能解决问题,ashift也不能使用任意变量解决问题。我也尝试过在循环中执行“time.sleep(1)”,以防ashift的延迟会对某些事情产生影响(在这里抓住救命稻草!)——没有