当我将文件加载到json中时,pythons将内存使用量峰值提升到大约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。
我正在尝试运行一些内存分析,但是现在大量使用100%的CPU大约一个小时,并且还没有产生任何输出。
有没有人有任何想法?我也尝试过使用cjson而不是打包的json模块。 cjson使用的内存减少了约30%,但显示出完全相同的问题。
我在Ubuntu服务器11.10上运行Python 2.7.2。
我很高兴加载任何内存分析器,看看它是否比堆更好,并提供您认为必要的任何诊断。我正在寻找一个大型的测试json文件,我可以为其他任何人提供这个文件。
答案 0 :(得分:14)
我认为这两个链接解决了一些有趣的问题,不一定是json问题,而只是一个“大对象”问题以及内存如何与python和操作系统协同工作
请参阅Why doesn't Python release the memory when I delete a large object?,了解为什么从python发布的内存不一定反映在操作系统中:
如果您创建一个大对象并再次删除它,Python可能已经释放了内存,但所涉及的内存分配器不一定会将内存返回给操作系统,因此看起来好像Python进程使用了很多比实际使用的虚拟内存更多。
关于running large object processes in a subprocess让操作系统处理清理工作:
确保大量但临时使用内存的唯一真正可靠的方法是在完成后将所有资源返回给系统,就是在子进程中使用该进程,这会占用大量内存,然后终止工作。在这种情况下,操作系统将完成其工作,并乐意回收子进程可能已经吞噬的所有资源。幸运的是,多处理模块在现代版本的Python中进行这种操作(过去相当痛苦)并不算太糟糕。