9

当我将文件加载到 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 文件,我可以提供给其他任何人试一试。

4

1 回答 1

14

我认为这两个链接解决了一些有趣的问题,这不一定是一个 json 问题,而只是一个“大对象”问题以及内存如何与 python 和操作系统一起工作

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

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

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

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

于 2012-06-15T20:53:08.763 回答