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