2012-06-15 116 views
6

当我将文件加载到json中时,pythons的内存使用率达到1.8GB左右,我似乎无法获得要释放的内存。我放在一起很简单的测试用例:巨大的Python的json模块的内存使用情况?

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

我很抱歉,我不能提供一个样本JSON文件,我的测试文件中有大量的敏感信息,但对于背景下,我处理与一个240MB的文件。在运行上述两行之后,我使用了前面提到的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文件,我可以提供给任何其他人使用它。

+0

请试用其他文件。你正在运行交互式会话或Python脚本文件?两者都显示相同的问题? – heltonbiker

+0

相关:http://stackoverflow.com/questions/2400643/is-there-a-memory-efficient-and-fast-way-to-load-big-json-files-in-python – ChristopheD

+0

@ChristopheD我的问题是内存永远不会被释放。我并不在乎在分析过程中使用了很多内存。 – Endophage

回答

13

我认为这两个环节解决这个一些有趣的观点不一定是一个JSON的问题,而只是一个“大对象”的问题和内存如何与蟒蛇工作VS操作系统

为什么记忆见Why doesn't Python release the memory when I delete a large object?从蟒蛇释放并不一定是由操作系统反映:

如果创建一个大型对象,并再次将其删除,巨蟒可能已经发布了记忆,但其中涉及到内存分配器不一定内存返回操作系统,所以它可能看起来好像Python进程比它使用更多的虚拟内存实际使用。

关于running large object processes in a subprocess让操作系统处理清理:

唯一的,以确保大,但临时使用的内存做了所有的资源返回时,它的完成系统真正可靠的方法,是让这种使用发生在一个子进程中,那么需要内存的工作就会终止。在这种情况下,操作系统将完成其工作,并乐意回收子进程可能吞并的所有资源。幸运的是,在现代版本的Python中,多处理模块使得这种操作(过去相当痛苦)不算太坏。

+1

请确保包含相关摘录/示例以抵制互联网上数据的非稳定性质:) – 2012-06-15 20:57:18

+0

@pst:谢谢!我感谢你补充说。 – jdi

+0

非常令人沮丧。它确实显示你的第一个片段准确地描述了情况。 – Endophage