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

cda*_*tte 6 python memory

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

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

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

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

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

col*_*onz 2

当然不是答案,但这里有一个来自 Python 开发者邮件列表的线程,它描述了一些听起来像你所经历的行为(我也经历过)。https://mail.python.org/pipermail/python-dev/2008-December/084450.html

经过一番挖掘,发现了一些有趣的事情:

  • 许多人说这归咎于交换太慢,但(线程的)操作和我的经验表明情况并非如此。
  • 其他人将其归咎于垃圾收集,我认为这是罪魁祸首的一部分。似乎有一些实现细节涉及释放不连续的内存块。
    • 该线程中的一个示例是垃圾收集排序列表根本不需要时间(1-2 秒),但是当同一列表被打乱时,会花费大量时间。

一种可能的解决方法是删除字典,同时仍保留对字典中对象的引用。它在此消息中呈现(非常接近线程的末尾)。https://mail.python.org/pipermail/python-dev/2008-December/084560.html

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