Python не освободит память для кортежа, не так ли? - PullRequest
1 голос
/ 11 ноября 2011

Согласно этой статье, которую я читал, похоже, что неизменный тип может стать бессмертным.

http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm

В настоящее время я работаю над решением проблемы использования памяти для моего веб-сервиса, работающего на движке приложений Google. Может ли "использовать слишком много кортежей" быть потенциальной причиной возникновения этой проблемы?


Спасибо за ответ: Я выполняю свой код на серверном экземпляре google app engine, и он имеет верхние границы использования памяти (128 МБ). Он сказал, что я использую больше памяти, чем позволено, и остановил свой экземпляр. Как отмечалось в комментариях, это может быть «использование памяти остается большим», а не «утечки памяти».

Ответы [ 3 ]

5 голосов
/ 12 ноября 2011

В этой статье не указываются неизменяемые типы - здесь указываются:

Другая возможная причина чрезмерного использования памяти заключается в том, что Python использует так называемые «свободные списки» для определенных типов объектов, включая целые числа иfloat.

Я не знаю, какую информацию вы можете получить о процессе GAE, но вы можете попробовать этот эксперимент на своей собственной системе.

Сначала запустите интерпретатор Pythonи найти процесс.Затем выполните эту команду:

>>> many_tuples = [() for x in range(5000000)] #replace with xrange for 2.x

Затем посмотрите на использование памяти.Вы только что создали список из 5 миллионов кортежей.Теперь введите:

>>> del many_tuples

В моей системе (Python 3.2, Win 7) использование моей памяти возросло примерно на 20 КБ, а затем уменьшилось на то же количество после того, как я del изменил переменную.Если вы можете получить информацию о своих процессах (ЦП, использование памяти), вы можете попытаться сделать это - возможно, несколько раз подряд, что должно дать вам несколько всплесков более высокого использования памяти.

1 голос
/ 12 ноября 2011

Неизменяемый тип не становится бессмертным. Занимаемая им память все еще принадлежит Python, но она доступна для использования другими объектами.

Круговые зависимости могут привести к утечке памяти:

class Parent(object):
    def __init__(self):
        self.offspring = Child(self)
    def __del__(self):
        # doesn't matter what goes here, gc will not be able to auto collect
        # freed Parents and Childs

class Child(object):
    def __init__(self, parent):
        self.parent = parent

John_Doe = Parent()

На данный момент у вас есть Child со ссылкой на Parent и Parent со ссылкой на Child, и у Python могут возникнуть проблемы с их освобождением.

1 голос
/ 11 ноября 2011

В статье, которую вы связали, я не вижу, чтобы кортежи были одним из типов, для которых Python поддерживает свои собственные бесплатные списки. Они вполне могут быть, но согласно этой статье конкретные виновники составляют int с, float с, dict с и list с. Хотя эта статья написана в 2005 году, и с тех пор все могло измениться ...

В Python 2.6 или более поздней версии свободные списки для всего, кроме int s и float s, можно очистить с помощью gc.collect(2), что, я думаю, не поможет вам в GAE, но я подумал, что упомянуть об этом.

...