删除ironpython中的大对象,并立即释放内存?

时间:2015-12-20 00:46:56

标签: collections ironpython garbage

我正在创建一个巨大的网格对象(大小约900兆字节)。 一旦我完成了分析,我想以某种方式将其从内存中删除。

我在stackoverflow.com上做了一些搜索,我发现del只会删除对提到的网格的引用。不是网格对象本身。 一段时间后,网格对象最终会被垃圾收集。

gc.collect()是我能够立即释放内存的唯一方法,并以某种方式从内存中删除提到的大网格吗? 我在stackoverflow.com上找到了回复,其中指出应该避免使用gc.collect()(至少在常规python,特别是ironpython)。 我还在stackoverflow上找到了一些评论,声称在IronPython中甚至没有保证如果没有别的东西存在引用就会释放内存。

对所有这些问题有何评论?

我正在使用ironpython 2.7版本。

感谢您的回复。

1 个答案:

答案 0 :(得分:2)

一般来说,如果对象不再存在引用(从根目录到对象本身的连接),则管理环境会重新存储内存。要强制.net框架释放内存,垃圾收集器是您唯一的选择。一般来说,重要的是要知道GC.Collect不释放内存,它只搜索没有引用的对象并将其放入一个将被释放的对象队列中。如果要释放内存同步,还需要GC.WaitForPendingFinalizers

有关.net框架中的大对象的一件事是,它们是单独存储在大对象堆(LOH)中的。从我的角度来看,同步释放这些对象并不坏,你只需要知道,这可能会导致一些性能问题。这就是为什么GC一般会决定它自己,何时收集和释放内存以及什么时候不来。

因为gc.collect是在Python和IronPython中实现的,所以你应该可以使用它。如果你看一下IronPython中的实现,gc.collect完全符合你的要求,请致电GC.Collect()GC.WaitForPendingFinalizer。所以在你的情况下,我会用它。

希望这有帮助。