我正在运行一些在数据库中的文档上迭代的内存密集型脚本,由于服务器上的内存限制,我在每次迭代结束时手动删除对大型对象的引用:
for document in database:
initial_function_calls()
big_object = memory_heavy_operation(document)
save_to_file(big_object)
del big_object
additional_function_calls()
initial_function_calls()
和additional_function_calls()
的内存都有点重。显式删除对大对象的引用以进行垃圾回收,有什么好处吗?或者,让它在下一次迭代中指向一个新对象就足够了吗?你知道吗
在这些情况下也经常如此;视情况而定。:-/
我想我们是在谈论CPython。你知道吗
使用
del
或重新分配名称可以减少对象的引用计数。只有当该引用可以达到0时,才能取消分配。因此,如果您不经意地将对big_object
的引用隐藏在某个地方,那么使用del
将毫无帮助。你知道吗何时触发垃圾回收取决于分配和取消分配的数量。请参阅^{} 的文档。你知道吗
如果您非常确定没有进一步的引用,那么可以使用^{} 来强制执行垃圾收集运行。如果您的代码不执行很多其他分配,这可能会有所帮助。你知道吗
需要记住的一点是,如果} 检查对象是否由垃圾收集器管理。你知道吗
big_object
是由C
扩展模块(例如numpy
)创建的,那么它可以管理自己的内存。那样的话垃圾收集就不会影响它了!此外,小整数和小字符串是预先分配的,不会被垃圾收集。可以使用^{我建议您在运行程序时使用} 。你知道吗
del
+gc.collect()
,并监视RAM的使用量。在类UNIX系统上,查看驻留集大小。也可以使用^{除非你看到常驻设置的大小越来越大,我不会担心它。你知道吗
相关问题 更多 >
编程相关推荐