我的代码在具有100GB内存的群集节点上运行在CentOS 6.6上。然而,这似乎仍然不够大,因为我的代码需要读取1000+个hickle文件(每个200MB)。这总共是240GB。当代码运行时,系统内存缓存会持续增加直到完全,并且在分配新对象和执行numpy数组计算时代码性能变得非常慢。
我尝试执行 gc.collect 和 del 以防止任何内存泄漏,但内存仍在增加。我怀疑这是由于文件缓存。所以我想知道在python sys或os lib中是否有一个函数可以在读取大量(1000个)大型hickle文件(每个200MB)或单个lmdb文件(240GB)时禁用python文件系统缓存。实际上,一旦阅读,我真的不需要缓存这些文件。
答案 0 :(得分:0)
由于Python使用引用计数,因此删除时会释放大多数对象。
自动垃圾收集器为您执行的唯一好事情是收集并释放具有循环引用的已删除对象 - 例如,如果您有引用自己或相互引用的对象:
>>> class Foo(object): pass
...
>>> x, y = Foo(), Foo()
>>> x.y = y
>>> y.x = x
如果您从未编写过创建此类引用的代码,或者您创建它们,但是然后手动中断它们,那么所有垃圾收集器都会浪费您的CPU时间,试图找到不存在的收集内容。如果你有很多小对象,这将真正减慢你的系统。
我不知道你的hickle文件 - 有时候在阅读或写这些东西时需要创建循环引用,但对于很多代码,最好用垃圾收集器来完全关闭它关闭使用gc.disable()
。