在创建巨大的对象之后,Python在函数结束时挂了好几个小时

时间:2018-01-25 14:22:47

标签: python memory

我有一个生成大对象的函数(在具有500Gb内存的机器上大约100-150Gb的内存)。

该函数在大约1小时内运行,并将文件写入磁盘(大约100Mb)。

但是当函数结束时,程序会在那里挂起几个小时而不做任何事情(在调用函数的地方之后它不会继续执行指令)。

我怀疑垃圾收集器试图删除在这个函数中创建的巨大对象,但我没有看到任何事情发生(strace打印没有),内存没有减少。

你知道为什么会这样,以及如何解决它? 我使用的是python 3.5

1 个答案:

答案 0 :(得分:1)

当然不是一个答案,但这是Python Developers邮件列表中的一个线程,它描述了一些听起来像您正在经历的行为(我也经历过)。 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

不幸的是,我无法从该线程中看到明确的解决方案,但是希望这有助于阐明正在发生的事情!