创建巨大对象后,Python 在函数结束时挂起数小时

标签 python memory

我有一个函数可以生成一个巨大的对象(大约 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/

相关文章:

exception - C++中抛出异常后应该如何释放内存?

iphone - UIImage imageNamed 未正确自动释放

python - Scipy 稀疏矩阵 - 不同实现的目的和用法

c - 段错误无效内存 0x0

c++ - 如何获取 C++ 中可用的虚拟内存量?

c++ - 在 MPI、C++ 上分配单个堆栈数组

python - 使用其他数据帧替换数据帧中的值,并将字符串作为 Pandas 的键

python - 如何知道父类的所有派生类?

python - 用于 Web 开发的 GWT 或 Python 或 Ruby

python - 更改现有网络驱动程序中的 ChromeOptions