使用 Python 工作。我有一个函数,它从队列中读取并根据从队列中读取的记录中的一些 XML 标记创建字典,然后返回该字典。我永远在循环中调用这个函数。每次都会重新分配字典。字典之前使用的内存是否在每次重新分配时被释放,或者它是否被孤立并最终导致内存问题?
def readq():
qtags = {}
# Omitted code to read the queue record, get XML string, DOMify it
qtags['result'] = "Success"
qtags['call_offer_time'] = get_node_value_by_name(audio_dom, 'call_offer_time')
# More omitted code to extract the rest of the tags
return qtags
while signals.sigterm_caught == False:
tags = readq()
if tags['result'] == "Empty":
time.sleep(SLEEP_TIME)
continue
# Do stuff with the tags
因此,当我在该循环中每次重新分配标签时,上一次分配使用的内存会在被新分配分配之前被释放吗?
最佳答案
如果可以证明(根据语言实现在运行时的知识)它不可能再被访问并且垃圾收集器认为它适合进行收集,则该对象的内存将被释放。这是绝对的最低限度,你不应该再假设了。而且您通常不必担心任何其他事情。
更实际地说,它可能会在上次引用之间的某个时间点被释放(其中“引用”不限于范围内的名称,但可以是使对象成为 reachable 的任何东西) 被删除并且内存耗尽。它不必由运行您的代码的 Python 实现释放,它也可以将内存清理留给操作系统,而忘记任何终结器等。请注意,在最后一个引用消失和内存使用量实际下降之间可能会有明显的延迟。但如前所述,如果有垃圾需要收集,大多数实现都会竭尽全力避免过度使用内存。
更实际的是,你可能会在 CPython(引用实现)上运行它,它总是使用并且最有可能总是使用引用计数(增加了一个真正的 GC 来处理循环引用),所以除非有一个循环引用(相对罕见,你的代码看起来不像有它们,但可能会出现在类似图形的结构中)一旦对它的最后一次引用被删除/覆盖,它就会被释放。当然,其他实现并不那么可预测 - 仅 PyPy 就有六种不同的垃圾收集器,除了一个属于上述段落之外。
关于python - 重新分配时,Python 字典是否释放了所有内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6738270/