【问题标题】:Delete the large object in ironpython, and instantly release the memory?删除ironpython中的大对象,瞬间释放内存?
【发布时间】:2015-12-20 00:46:56
【问题描述】:

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

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

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

关于所有这些问题的任何 cmet 吗?

我使用的是 ironpython 2.7 版本。

感谢您的回复。

【问题讨论】:

    标签: collections ironpython garbage


    【解决方案1】:

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

    关于 .net 框架中的大对象需要了解的一点是,它们单独存储在大对象堆 (LOH) 中。从我的观点来看,释放这些对象同步也不错,你只需要知道,这可能会导致一些性能问题。这就是为什么通常 GC 自己决定何时收集和释放内存以及何时不这样做。

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

    希望这会有所帮助。

    【讨论】:

    • 感谢@BendEg 的回复。我不是程序员,所以让我看看我是否理解正确:您建议致电:del meshObject; gc.collect()。并且 GC.WaitForPendingFinalizer 不应该被调用,因为 Ironpython 会因为上面的 gc.collect() 语句而自动调用它。我理解正确吗?
    • 是的,你理解我的回答是正确的。如果必须同步并立即释放内存,那么您别无选择,只能使用垃圾收集器。
    猜你喜欢
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 2018-08-10
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多