Подтвердить что ты не робот

Python - память не возвращается к ядру

У меня очень простой script, который выделяет память, dels единственную ссылку на значительный объект, все время печати отчетов heapy и pidstat. После запуска script, heapy говорит мне, что не должно быть много памяти, когда pidstat говорит мне обратное:

from guppy import hpy
import time
import sys
import os

'''
1) print heapy and pidstat report after starting and before actually doing any work
2) allocate some memory in a simple 2d array
3) print heapy and pidstat report
4) del the d2 array (attempt at garbage collection)
5) print heapy and pidstat report
6) sleep so pidstat can continue to be run to check on memory
'''

def pidstat(msg):
    print '==============================='
    print msg
    os.system('pidstat -r -p %s' % os.getpid())
    print '+++++++++++++++++++++++++++++++'
    print hpy().heap()[0]
    print '==============================='

pidstat('before doing anything')
docs = []
for doc in range(0, 10000):
    docs.append([j for j in range(0, 1000)])

pidstat('after fetching all the docs into memory')
del docs

pidstat('after freeing the docs')
time.sleep(60)

Выход выглядит следующим образом:

===============================
before doing anything
Linux 2.6.38-15-generic (hersheezy)     08/14/2012  _x86_64_    (4 CPU)

01:05:20 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
01:05:20 PM      5360      0.44      0.00   44768   9180   0.11  python
+++++++++++++++++++++++++++++++
Partition of a set of 19760 objects. Total size = 1591024 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0  19760 100  1591024 100   1591024 100 str
===============================
===============================
after fetching all the docs into memory
Linux 2.6.38-15-generic (hersheezy)     08/14/2012  _x86_64_    (4 CPU)

01:05:21 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
01:05:21 PM      5360      8.95      0.00  318656 279120   3.49  python
+++++++++++++++++++++++++++++++
Partition of a set of 7431665 objects. Total size = 178359960 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0 7431665 100 178359960 100 178359960 100 int
===============================
===============================
after freeing the docs
Linux 2.6.38-15-generic (hersheezy)     08/14/2012  _x86_64_    (4 CPU)

01:05:29 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
01:05:29 PM      5360     40.23      0.00  499984 460480   5.77  python
+++++++++++++++++++++++++++++++
Partition of a set of 19599 objects. Total size = 1582016 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0  19599 100  1582016 100   1582016 100 str
===============================

Как я могу убедиться, что эта память возвращается в операционную систему?

4b9b3361

Ответ 1

Может существовать разница между тем, когда память становится доступной для повторного использования внутри процесса python и при ее выпуске в ОС. В частности, стандартный интерпретатор Python (CPython) поддерживает свои собственные пулы и списки для отдельных видов объектов. Он будет повторно использовать память в самих пулах, но никогда не будет выпускать ее в ОС после ее использования.

Подробнее см. .

Ответ 2

Как я могу убедиться, что эта память возвращается в операционную систему?

Это вообще не будет. Python выделяет память на "аренах", и даже когда ссылки удаляются в интерпретаторе, он будет удерживаться на этой арене памяти, чтобы использовать ее позже. Я ДУМАЮТ, что в более новой версии python есть механизм, чтобы освободить арены, если они полностью пусты. Но у вас нет контроля над местами размещения ваших объектов.