删除ironpython中的大对象,瞬间释放内存?
Delete the large object in ironpython, and instantly release the memory?
我正在创建一个巨大的网格对象(大小约为 900 兆字节)。
一旦我分析完它,我想以某种方式将它从内存中删除。
我在 whosebug.com 上做了一些搜索,我发现 del
只会删除对提到的网格的引用。不是网格对象本身。
一段时间后,网格对象最终将被垃圾收集。
gc.collect()
是我可以立即释放内存并以某种方式从内存中删除提到的大网格的唯一方法吗?
我在这里找到了关于 whosebug.com 的回复,其中指出应该避免 gc.collect()
(至少在涉及到常规 python 时,而不是特别是 ironpython)。
我还在此处找到关于 Whosebug 的评论,这些评论声称在 IronPython 中,如果没有其他内容持有引用,甚至不能保证内存将被释放。
对所有这些问题有什么意见吗?
我用的是ironpython 2.7版本
感谢您的回复。
在一般的托管环境中,如果不再存在对对象的引用(从根到对象本身的连接),则释放内存。要强制 .net 框架释放内存,垃圾收集器是您唯一的选择。一般来说,重要的是要知道 GC.Collect
不会释放内存,它只会搜索没有引用的对象并将其放入将被释放的对象队列中。如果要释放内存同步,还需要GC.WaitForPendingFinalizers
。
关于 .net 框架中的大对象需要了解的一件事是,它们单独存储在大对象堆 (LOH) 中。从我的观点来看,同步释放那些对象并不坏,你只需要知道,这会导致一些性能问题。这就是为什么通常 GC 自行决定何时收集和释放内存以及何时不收集和释放内存的原因。
因为 gc.collect
在 Python 和 IronPython 中实现,您应该可以使用它。如果您查看 IronPython 中的实现,gc.collect
完全符合您的要求,请调用 GC.Collect()
和 GC.WaitForPendingFinalizer
。所以在你的情况下,我会使用它。
希望对您有所帮助。
我正在创建一个巨大的网格对象(大小约为 900 兆字节)。 一旦我分析完它,我想以某种方式将它从内存中删除。
我在 whosebug.com 上做了一些搜索,我发现 del
只会删除对提到的网格的引用。不是网格对象本身。
一段时间后,网格对象最终将被垃圾收集。
gc.collect()
是我可以立即释放内存并以某种方式从内存中删除提到的大网格的唯一方法吗?
我在这里找到了关于 whosebug.com 的回复,其中指出应该避免 gc.collect()
(至少在涉及到常规 python 时,而不是特别是 ironpython)。
我还在此处找到关于 Whosebug 的评论,这些评论声称在 IronPython 中,如果没有其他内容持有引用,甚至不能保证内存将被释放。
对所有这些问题有什么意见吗?
我用的是ironpython 2.7版本
感谢您的回复。
在一般的托管环境中,如果不再存在对对象的引用(从根到对象本身的连接),则释放内存。要强制 .net 框架释放内存,垃圾收集器是您唯一的选择。一般来说,重要的是要知道 GC.Collect
不会释放内存,它只会搜索没有引用的对象并将其放入将被释放的对象队列中。如果要释放内存同步,还需要GC.WaitForPendingFinalizers
。
关于 .net 框架中的大对象需要了解的一件事是,它们单独存储在大对象堆 (LOH) 中。从我的观点来看,同步释放那些对象并不坏,你只需要知道,这会导致一些性能问题。这就是为什么通常 GC 自行决定何时收集和释放内存以及何时不收集和释放内存的原因。
因为 gc.collect
在 Python 和 IronPython 中实现,您应该可以使用它。如果您查看 IronPython 中的实现,gc.collect
完全符合您的要求,请调用 GC.Collect()
和 GC.WaitForPendingFinalizer
。所以在你的情况下,我会使用它。
希望对您有所帮助。