Python монотонно увеличивает использование памяти (утечка?) - PullRequest
9 голосов
/ 28 июля 2011

Я использую этот простой код и наблюдаю монотонно увеличивающееся использование памяти. Я использую этот маленький модуль для выгрузки материала на диск. Я заметил, что это происходит со строками 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

1 Ответ

14 голосов
/ 28 июля 2011

Модуль выбора хранит все объекты, которые он видел в своей заметке, поэтому ему не нужно мариновать одну и ту же вещь дважды.Вы хотите пропустить это (чтобы ссылки на ваши объекты не сохранялись в вашем объекте выбора) и очистить заметку перед сбросом:

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

Редактировать: Выможет на самом деле наблюдать за тем, как увеличивается размер заметки при выборе объектов, используя следующую функцию добавления:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...