2

我们使用了许多大型对象。理想情况下,我们希望将它们全部永久地提供给客户端代码,但它们不能一次全部放入物理内存中。所以当我们接近内存限制时,我们需要销毁池中的一些对象(可能,我们将销毁最近最少使用的对象)。(使用磁盘上的虚拟内存等于完全冻结系统。)

具体而言,每个对象的内存在 ~100MB 和 ~10GB 之间变化;我们拥有的 RAM 总量为 32GB。

不幸的是,我们不知道每个对象使用的内存,直到它被创建。因此,我们无法预测任何给定对象是否适合可用的物理内存。

一个好的解决方案是为 Python 内存分配器提供回调函数,并在看到可用物理内存量低于某个阈值时让内存分配器调用它。该回调函数将简单地从池中销毁一个对象,然后返回。虽然一般来说,不能保证内存会立即可用,但在 CPython 中肯定会(它会在引用计数器达到零时释放内存),这可能是我所要求的。

不幸的是,我不知道有什么方法可以让 Python 内存分配器在内存不足时调用提供给它的函数。还有什么我可以做的吗?

我想我可以在后台运行一个单独的线程,并每隔一秒左右检查一次可用内存。如果它发现可用的物理内存少于 5GB,它将开始从池中销毁对象。假设对象销毁的平均速度至少与对象创建的速度一样快,那么 5GB 缓冲不会被用完太多,我们会没事的。这似乎很脆弱;但是这种方法的任何实现想法仍然很棒。

这必须在 Python 3.2 下的 Linux 上工作,但如果也有适用于 Windows 的(可能不同的)解决方案,那就太好了。

注意:三层内存分配在起作用:操作系统、malloc(C 运行时)和 Python 对象分配器。

4

0 回答 0