我正在打擊一個Python項目中的內存泄漏,並且已經花費了很多時間。我已經將這個問題推演爲一個小例子。現在好像我知道解決方案,但我不明白爲什麼。爲什麼python list slice分配會消耗內存?
import random
def main():
d = {}
used_keys = []
n = 0
while True:
# choose a key unique enough among used previously
key = random.randint(0, 2 ** 60)
d[key] = 1234 # the value doesn't matter
used_keys.append(key)
n += 1
if n % 1000 == 0:
# clean up every 1000 iterations
print 'thousand'
for key in used_keys:
del d[key]
used_keys[:] = []
#used_keys = []
if __name__ == '__main__':
main()
的想法是,我存儲在字典d
一些價值觀和記憶使用的密鑰列表中,以便能夠清潔字典不時。
該程序的這種變化自信地消耗內存從不返回它。如果我使用替代方法來「清除」used_keys
這個例子中的評論,一切都很好:內存消耗保持在恆定的水平。
爲什麼?
測試CPython和許多linuxes。
你怎麼知道它肯定永遠不會返回它?這可能只是因爲操作系統從不要求它回來。 – detly 2010-07-30 08:25:23
不應該清除'used_keys'在'used_keys'循環中的鍵之外? – adamk 2010-07-30 08:27:13
>我的想法是,我在dict d中存儲了一些值,並在列表中記憶使用的鍵以便能夠不時地清理字典。 爲什麼不使用'd.keys()'?它將是相同的密鑰列表。 – 2010-07-30 08:28:53