gpt4 book ai didi

Python单调增加内存使用量(泄漏?)

转载 作者:太空狗 更新时间:2023-10-29 20:14:47 28 4
gpt4 key购买 nike

我正在使用这个简单的代码并观察单调增加的内存使用量。我正在使用这个小模块将内容转储到磁盘。我观察到它发生在 unicode 字符串上而不是整数上,我做错了什么吗?

当我这样做时:

>>> from utils.diskfifo import DiskFifo
>>> df=DiskFifo()
>>> for i in xrange(1000000000):
... df.append(i)

内存消耗稳定

但是当我这样做的时候:

>>> while True:
... a={'key': u'value', 'key2': u'value2'}
... df.append(a)

它到达屋顶。有什么提示吗?在模块下面...


import tempfile
import cPickle

class DiskFifo:
def __init__(self):
self.fd = tempfile.TemporaryFile()
self.wpos = 0
self.rpos = 0
self.pickler = cPickle.Pickler(self.fd)
self.unpickler = cPickle.Unpickler(self.fd)
self.size = 0

def __len__(self):
return self.size

def extend(self, sequence):
map(self.append, sequence)

def append(self, x):
self.fd.seek(self.wpos)
self.pickler.dump(x)
self.wpos = self.fd.tell()
self.size = self.size + 1

def next(self):
try:
self.fd.seek(self.rpos)
x = self.unpickler.load()
self.rpos = self.fd.tell()
return x

except EOFError:
raise StopIteration

def __iter__(self):
self.rpos = 0
return self

最佳答案

pickler 模块存储它在其备忘录中看到的所有对象,因此它不必对同一事物进行两次 pickle。你想跳过这个(所以对你的对象的引用不会存储在你的 pickler 对象中)并在转储之前清除备忘录:

def append(self, x):
self.fd.seek(self.wpos)
self.pickler.clear_memo()
self.pickler.dump(x)
self.wpos = self.fd.tell()
self.size = self.size + 1

来源:http://docs.python.org/library/pickle.html#pickle.Pickler.clear_memo

编辑:您实际上可以看到备忘录的大小随着您使用以下追加函数 pickle 对象而增加:

def append(self, x):
self.fd.seek(self.wpos)
print len(self.pickler.memo)
self.pickler.dump(x)
self.wpos = self.fd.tell()
self.size = self.size + 1

关于Python单调增加内存使用量(泄漏?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6857006/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com