我有一个函数可以生成一个巨大的对象(大约 100-150Gb 内存,在具有 500Gb 内存的机器上)。
该函数运行约 1 小时,并将文件写入磁盘(约 100Mb)。
但是当函数结束时,程序会在那里挂几个小时而不做任何事情(它不会在调用函数的地方之后继续指令)。
我怀疑垃圾收集器试图删除在此函数中创建的巨大对象,但我没有看到任何事情发生(strace 不打印任何内容),内存也没有减少。
您知道为什么会发生这种情况以及如何解决吗? 我正在使用 python 3.5
最佳答案
当然不是答案,但这里有一个来自 Python 开发人员邮件列表的线程,它描述了一些听起来像您正在经历的行为(我也经历过)。 https://mail.python.org/pipermail/python-dev/2008-December/084450.html
稍微深入了解一下,发现了一些有趣的东西:
- 许多人将此归咎于交换太慢,但(线程的)OP 和我的经验表明情况并非如此。
- 其他人将其归咎于垃圾收集,我认为这是罪魁祸首。似乎有一些实现细节涉及释放不连续的内存块。
- 线程中的一个例子是垃圾收集排序列表根本不需要时间(1-2 秒),但是当同一个列表被打乱时,会花费过多的时间。
一种可能的解决方法是删除字典,同时仍然保留对字典中对象的引用。它出现在这条消息中(非常接近线程的末尾)。 https://mail.python.org/pipermail/python-dev/2008-December/084560.html
不幸的是,从线程中我无法看到明确的解决方案,但希望这有助于阐明正在发生的事情!
关于创建巨大对象后,Python 在函数结束时挂起数小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48445144/