Python的json模块占用内存巨大?

问题描述 投票:0回答:1

当我将文件加载到 json 中时,python 的内存使用量激增至约 1.8GB,而且我似乎无法释放该内存。我整理了一个非常简单的测试用例:

with open("test_file.json", 'r') as f:
    j = json.load(f)

很抱歉,我无法提供示例 json 文件,我的测试文件有很多敏感信息,但就上下文而言,我正在处理一个大约 240MB 的文件。运行以上 2 行后,我已经使用了前面提到的 1.8GB 内存。如果我这样做

del j
内存使用量根本不会下降。如果我用
gc.collect()
跟随它,它仍然不会掉落。我什至尝试卸载 json 模块并运行另一个 gc.collect。

我正在尝试运行一些内存分析,但 heapy 已经 100% CPU 运行了大约一个小时,并且尚未产生任何输出。

有人有什么想法吗?我还使用 cjson 而不是打包的 json 模块尝试了上述操作。 cjson 使用的内存减少了大约 30%,但在其他方面显示完全相同的问题。

我在 Ubuntu 服务器 11.10 上运行 Python 2.7.2。

我很乐意加载任何内存分析器,看看它是否比 heapy 更好,并提供您可能认为必要的任何诊断。我正在寻找一个大型测试 json 文件,我可以提供该文件供其他人尝试。

python json memory-leaks
1个回答
15
投票

我认为这两个链接解决了一些有趣的问题,这不一定是一个

json
问题,而只是一个“大对象”问题以及内存如何与Python和操作系统一起工作

请参阅为什么Python在删除大对象时不释放内存?了解为什么从Python释放的内存不一定会被操作系统反映:

如果创建一个大对象并再次删除它,Python可能已经释放了内存,但是涉及的内存分配器不一定将内存返回给操作系统,因此看起来Python进程使用了更多的虚拟内存内存比实际使用的要多。

关于在子进程中运行大对象进程以让操作系统处理清理工作:

确保大量但临时的内存使用在完成后确实将所有资源返回给系统的唯一真正可靠的方法是在子进程中进行该使用,该子进程执行消耗内存的工作然后终止。在这种情况下,操作系统将完成其工作,并很乐意回收子进程可能占用的所有资源。幸运的是,多处理模块使得这种操作(过去相当痛苦)在现代版本的 Python 中并不算太糟糕。

© www.soinside.com 2019 - 2024. All rights reserved.