End*_*age 7 python json memory-leaks
当我将文件加载到json中时,pythons将内存使用量激增至约1.8GB,我似乎无法释放该内存.我整理了一个非常简单的测试用例:
with open("test_file.json", 'r') as f:
j = json.load(f)
Run Code Online (Sandbox Code Playgroud)
很抱歉我无法提供示例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文件,我可以为其他任何人提供它.
jdi*_*jdi 14
我认为这两个链接解决了一些有趣的问题,这不一定是json问题,而只是一个"大对象"问题以及内存如何与python和操作系统一起工作
请参阅为什么删除大对象时Python不会释放内存?为什么从python发布的内存不一定反映在操作系统中:
如果你创建一个大对象并再次删除它,Python可能已经释放了内存,但所涉及的内存分配器不一定会将内存返回给操作系统,所以看起来好像Python进程使用了更多的虚拟内存而不是它实际使用.
关于在子进程中运行大型对象进程以让操作系统处理清理:
确保大量但临时使用内存的唯一真正可靠的方法是在完成后将所有资源返回给系统,就是在子进程中使用该进程,这会占用大量内存,然后终止工作.在这种情况下,操作系统将完成其工作,并乐意回收子进程可能已经吞噬的所有资源.幸运的是,多处理模块在现代版本的Python中进行这种操作(过去相当痛苦)并不算太糟糕.
归档时间: |
|
查看次数: |
4866 次 |
最近记录: |