LINUX.ORG.RU

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


0

0

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

a=None

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

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

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

anonymous
()

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

у меня всё высвобождается,
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
()
Ответ на: Re: освобождение памяти в python от anonymous

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

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

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


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


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

anonymous
()
Ответ на: Re: освобождение памяти в python от anonymous

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

> покажи что там с памятью у тебя у питона на 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
()
Ответ на: Re: освобождение памяти в python от anonymous

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

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

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

anonymous
()
Ответ на: Re: освобождение памяти в python от anonymous

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

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

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

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