LINUX.ORG.RU

освобождение памяти в python


0

0

собсвенно вопрос - когда и как python освобождает пямять?
не особо понятно что есть слабые ссылки и когда они работают...
скажем имеем код
a = []
for i in xrange(100000):
  a.append(i)

a=None

вроде бы как больше на список ссылок нету, а процес всеравно есть память...
anonymous

Это известная багофича, он освобождённую память не отдаёт системе, а оставляет себе для последующего использования. Логика такая: если процесс однажды зохавал и освободил 100 мег памяти, то вероятно, скоро ему опять понадобится примерно столько же, и есть смысл эту память пока придержать.

anonymous
()

у меня всё высвобождается,
Python 3.0a4+ (py3k:62516, Apr 27 2008, 05:12:55):

import time

a = []
for i in range(1000000):
  a.append(i)

time.sleep(10)
a=None
print("FREED")
time.sleep(10)


PS xrange в новом питоне переименован в range

anonymous
()
Ответ на: комментарий от anonymous

> В 2.5 исправили.

А ты проверял или на слово поверил? У меня в 2.5.2 ни разу не освобождается.

anonymous
()
Ответ на: комментарий от anonymous

Щас проверил на 2.5.2, результаты на моей проге такие:
VSS/RSS:
до высвобождения:
20356/18268
после:
16112/14364

Для сравнения python3.0 снапшот от 27 апреля:
26564/23440
6196/3664


Видимо, в разных ветках аллокатор работает по-разному.


//аноним с python3.0a4+

anonymous
()
Ответ на: комментарий от anonymous

Действительно, в py3k-svn всё в порядке, спасибо.

anonymous
()
Ответ на: комментарий от anonymous

что такое FF?

покажи что там с памятью у тебя у питона на 3.0a4+.

Может это из-за --with(out)-pymalloc disable/enable specialized mallocs?

anonymous
()
Ответ на: комментарий от anonymous

PS про фаерфокс понял. По идее не должно быть. Тут нет кучи мелкий аллокаций чтобы это себя проявило.

anonymous
()
Ответ на: комментарий от anonymous

> покажи что там с памятью у тебя у питона на 3.0a4+.

$ python3.0
>>> Python 3.0a4+ (py3k:62668, May  4 2008, 00:04:22)
[GCC 4.1.2 20070214 (  (gdc 0.24, using dmd 1.020)) (Gentoo 4.1.2 p1.0.2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
# USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
# anonymous 5001  0.0  0.5  24768  6004 pts/0    S+    8:58   0:00 ./python3.0
>>> a = []
>>> for i in range(10000000):
...     a.append(i)
...
>>>
# anonymous 5001 10.1 39.6 427588 407232 pts/0   S+    8:58   0:14 ./python3.0
>>> a = None
>>>
# anonymous 5001  3.9 32.0 347968 329108 pts/0   S+    8:58   0:15 ./python3.0

Итого, отъедает 400 мегабайт, обратно отдаёт около 70, остальное оставляет себе.

anonymous
()
Ответ на: комментарий от anonymous

О, прикол, убрал ~/python/lib из PYTHONPATH, и python3.0 стал нормально освобождать память. Буду разбираться.

anonymous
()
Ответ на: комментарий от anonymous

у меня при твоём тесте питон отъёдает всего vss/rss 208024/202884, а у тебя 400метров. Странно. Может у тебя amd64?

anonymous
()
Ответ на: комментарий от anonymous

> Тут нет кучи мелкий аллокаций чтобы это себя проявило.

Ошибаетесь. Прочитайте ссылку выше (python-memory). Каждый int, float и прочая мелочь выделяется в куче. Поэтому для мелких объектов у питона своя реализация malloc, которая как раз и не отдает память ради скорости. Для крупных объектов используется обычный malloc.

anonymous
()
Ответ на: комментарий от anonymous

> Ошибаетесь. Прочитайте ссылку выше (python-memory).

Неправильно выразился. Нет в данном случае фрагментации. Посмотри на мои примеры, всё вернулось назад. Вот то почему оно вернулось назад я и хотел сказать.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.