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

2024-06-02 05:47:20 发布

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

我使用这个简单的代码,观察内存使用的单调增长。我用这个小模块把数据转储到磁盘上。我观察到unicode字符串会发生这种情况,而不是整数,有什么地方我做错了吗?在

当我这样做的时候:

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

内存消耗稳定

但当我这么做的时候:

^{pr2}$

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


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

Tags: 模块内存importselfdfsizereturndef
1条回答
网友
1楼 · 发布于 2024-06-02 05:47:20

pickler模块存储它在其memo中看到的所有对象,因此不必对同一个对象进行两次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

编辑: 通过使用以下append函数,您可以实际观察备忘录的大小随着pickle对象的增加而增大:

^{pr2}$

相关问题 更多 >