我们使用了许多大型物体。理想情况下,我们希望将所有这些内容永久地用于客户端代码,但它们不能同时适用于物理内存。因此,当我们接近内存限制时,我们需要销毁池中的一些对象(可能,我们将销毁最近最少使用的对象)。 (在磁盘上使用虚拟内存等同于完全冻结系统。)
具体来说,每个对象的内存在~100MB到~10GB之间变化;我们拥有的RAM总量为32GB。
不幸的是,我们不知道每个对象在创建之前使用的内存。因此,我们无法预测任何给定的对象是否适合可用的物理内存。
一个好的解决方案是为Python内存分配器提供一个回调函数,并在看到空闲物理内存量低于某个阈值时让内存分配器调用它。该回调函数将简单地从池中销毁一个对象,然后返回。虽然一般情况下,并不能保证内存会立即可用,但它肯定会在CPython中释放(当参考计数器达到零时释放内存),这可能与我要求的一样多。
不幸的是,当内存不足时,我不知道有什么办法让Python内存分配器调用一个提供给它的函数。还有什么我可以做的吗?
我想我可以在后台运行一个单独的线程,每隔一秒检查一次可用的内存。如果它看到可用的物理内存少于5GB,它将开始销毁池中的对象。假设物体破坏进程平均至少与物体创造速度一样快,那么5GB的垫子不会用得太多,我们会没事的。这看起来很脆弱;但是这种方法的任何实施思路都会很棒。
这必须在Python 3.2下运行Linux,但如果有一个(可能不同的)Windows解决方案也会很好。
注意:Three tiers of memory allocation are at work:操作系统,malloc
(C运行时)和Python对象分配器。