这是一个创建于 1240 天前的主题,其中的信息可能已经有所发展或是发生改变。
最近用 py 写几个检测脚本,由于想实时看某些状态对不对,所以打了很多信息到终端上,结果跑几天,内存就顶不住了,不知道是不是这个原因导致的。
第 1 条附言 · 2020-11-04 17:15:43 +08:00
再补充说明一下:
流程是,开启一个子线程去获取 socket 的 bytes 数据,然后 json.load 成 list,放到 deque 里。deque 里 maxlen 只设为 1 (因为每次检测分析的时候,只想分析最新的 socket 数据)。
然后主线程,就是拿这 list 去检测分析(因为这检测分析时间较久,因此可能出现检测期间,会获取到多次 socket 数据,然后多次 deque.append )
但是现在发现一个问题,就是我本来想着,deque.append,挤掉的 list 会被自动回收,内存会还回来(因为我想的是,主线程还在分析,也就没有对这个 list 引用,那它的引用计数应该不会增加,那么就会被 gc 自动回收)。结果发现并没有,还是占在那。难道是因为这个原因导致的吗?
第 2 条附言 · 2020-11-05 10:54:29 +08:00
刚测试了一下子,死循环 print,发现内存没变。
死循环 arcpy.AddMessage,内存会狂涨。
我本以为 arcpy.AddMessage 也是跟 print 一样,但是现在看来他大概是实例化了一个 Message 对象,然后输出到控制台的。输出的越多,他实例化的对象就越多,然后内存就涨爆了。
arcgis 真坑。
3 条回复 • 2020-11-05 01:17:39 +08:00
![lx0758](https://cdn.v2ex.com/gravatar/ae316c8c0529be036a868b688535b23f?s=48&d=retro) |
|
1
lx0758 2020-11-04 16:37:53 +08:00
你怕不是一直在累加, 要知道一天的日志少说也有几十上百兆
|
![lx0758](https://cdn.v2ex.com/gravatar/ae316c8c0529be036a868b688535b23f?s=48&d=retro) |
|
2
lx0758 2020-11-04 16:38:58 +08:00
看错了, 无视上面的回复吧
|
![abersheeran](https://cdn.v2ex.com/avatar/cefa/05c9/492816_normal.png?m=1706147437) |
|
3
abersheeran 2020-11-05 01:17:39 +08:00
怕是 Socket 没释放吧。Python 处理循环引用的能力很弱,我以前也遇见过类似的问题。
|