gpt4 book ai didi

Python json 内存膨胀

转载 作者:太空狗 更新时间:2023-10-30 01:24:04 25 4
gpt4 key购买 nike

import json
import time
from itertools import count

def keygen(size):
for i in count(1):
s = str(i)
yield '0' * (size - len(s)) + str(s)

def jsontest(num):
keys = keygen(20)
kvjson = json.dumps(dict((keys.next(), '0' * 200) for i in range(num)))
kvpairs = json.loads(kvjson)
del kvpairs # Not required. Just to check if it makes any difference
print 'load completed'

jsontest(500000)

while 1:
time.sleep(1)

Linux top 表示 python 进程在完成“jsontest”函数后拥有约 450Mb 的 RAM。如果省略对“json.loads”的调用,则不会观察到此问题。执行此函数后的 gc.collect 确实会释放内存

由于对 gc.collect 的显式调用正在释放内存,所以看起来内存没有保存在任何缓存或 python 的内部内存分配器中。

发生这种情况是因为从未达到垃圾收集的阈值(700、10、10)吗?

我确实在 jsontest 之后放了一些代码来模拟阈值。但这没有帮助。

最佳答案

把它放在程序的顶部

import gc
gc.set_debug(gc.DEBUG_STATS)

只要有集合,您就会得到打印输出。您会看到在您的示例代码中,jsontest 完成后没有集合,直到程​​序退出。

你可以放

print gc.get_count()

查看当前计数。第一个数字是自第 0 代的最后一次收集以来分配超过释放的数量;第二个(resp.third)是自上次收集第 1 代(resp.2)以来收集第 0 代(resp.1)的次数。如果您在 jsontest 完成后立即打印这些,您会看到计数是 (548, 6, 0) 或类似的东西(毫无疑问,这会因 Python 版本而异) .所以没有达到阈值,也没有发生收集。

这是基于阈值的垃圾回收调度的典型行为。如果需要将空闲内存及时归还给操作系统,那么就需要将基于阈值的调度和基于时间的调度结合起来(即在上次回收后经过一定时间后请求再次回收,即使尚未达到阈值)。

关于Python json 内存膨胀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6536510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com