This topic created in 2033 days ago, the information mentioned may be changed or developed.
最近用 py 写几个检测脚本,由于想实时看某些状态对不对,所以打了很多信息到终端上,结果跑几天,内存就顶不住了,不知道是不是这个原因导致的。
Supplement 1 Nov 4, 2020 再补充说明一下:
流程是,开启一个子线程去获取 socket 的 bytes 数据,然后 json.load 成 list,放到 deque 里。deque 里 maxlen 只设为 1 (因为每次检测分析的时候,只想分析最新的 socket 数据)。
然后主线程,就是拿这 list 去检测分析(因为这检测分析时间较久,因此可能出现检测期间,会获取到多次 socket 数据,然后多次 deque.append )
但是现在发现一个问题,就是我本来想着,deque.append,挤掉的 list 会被自动回收,内存会还回来(因为我想的是,主线程还在分析,也就没有对这个 list 引用,那它的引用计数应该不会增加,那么就会被 gc 自动回收)。结果发现并没有,还是占在那。难道是因为这个原因导致的吗?
Supplement 2 Nov 5, 2020 刚测试了一下子,死循环 print,发现内存没变。
死循环 arcpy.AddMessage,内存会狂涨。
我本以为 arcpy.AddMessage 也是跟 print 一样,但是现在看来他大概是实例化了一个 Message 对象,然后输出到控制台的。输出的越多,他实例化的对象就越多,然后内存就涨爆了。
arcgis 真坑。
3 replies 2020-11-05 01:17:39 +08:00  | | 1 lx0758 Nov 4, 2020 你怕不是一直在累加, 要知道一天的日志少说也有几十上百兆 |
 | | 2 lx0758 Nov 4, 2020 看错了, 无视上面的回复吧 |
 | | 3 abersheeran Nov 5, 2020 怕是 Socket 没释放吧。Python 处理循环引用的能力很弱,我以前也遇见过类似的问题。 |