在覆盖大型Python对象的引用之前删除该引用有什么好处吗?

2024-04-25 12:22:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行一些在数据库中的文档上迭代的内存密集型脚本,由于服务器上的内存限制,我在每次迭代结束时手动删除对大型对象的引用:

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()的内存都有点重。显式删除对大对象的引用以进行垃圾回收,有什么好处吗?或者,让它在下一次迭代中指向一个新对象就足够了吗?你知道吗


Tags: 对象内存文档服务器脚本数据库objectfunction
1条回答
网友
1楼 · 发布于 2024-04-25 12:22:22

在这些情况下也经常如此;视情况而定。:-/

我想我们是在谈论CPython。你知道吗

使用del或重新分配名称可以减少对象的引用计数。只有当该引用可以达到0时,才能取消分配。因此,如果您不经意地将对big_object的引用隐藏在某个地方,那么使用del将毫无帮助。你知道吗

何时触发垃圾回收取决于分配和取消分配的数量。请参阅^{}的文档。你知道吗

如果您非常确定没有进一步的引用,那么可以使用^{}来强制执行垃圾收集运行。如果您的代码不执行很多其他分配,这可能会有所帮助。你知道吗

需要记住的一点是,如果big_object是由C扩展模块(例如numpy)创建的,那么它可以管理自己的内存。那样的话垃圾收集就不会影响它了!此外,小整数和小字符串是预先分配的,不会被垃圾收集。可以使用^{}检查对象是否由垃圾收集器管理。你知道吗

我建议您在运行程序时使用del+gc.collect(),并监视RAM的使用量。在类UNIX系统上,查看驻留集大小。也可以使用^{}。你知道吗

除非你看到常驻设置的大小越来越大,我不会担心它。你知道吗

相关问题 更多 >