Рассмотрим следующий сценарий:
l = [i for i in range(int(1e8))]
l = []
import gc
gc.collect()
# 0
gc.get_referrers(l)
# [{'__builtins__': <module '__builtin__' (built-in)>, 'l': [], '__package__': None, 'i': 99999999, 'gc': <module 'gc' (built-in)>, '__name__': '__main__', '__doc__': None}]
del l
gc.collect()
# 0
Дело в том, что после всех этих шагов использование памяти этим процессом python составляет около 30% на моем компьютере (Python 2.6.5, более подробная информация по запросу?).Вот выдержка из вывода top:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5478 moooeeeep 20 0 2397m 2.3g 3428 S 0 29.8 0:09.15 ipython
соотв.ps aux
:
moooeeeep 5478 1.0 29.7 2454720 2413516 pts/2 S+ 12:39 0:09 /usr/bin/python /usr/bin/ipython gctest.py
Согласно документам для gc.collect
:
Не все элементы в некоторых свободных списках могут быть освобождены из-законкретная реализация, в частности int
и float
.
Означает ли это, что если мне (временно) нужно большое количество различных int
или float
чисел, мне нужно экспортироватьэто на C / C ++, потому что Python GC не может освободить память?
Обновление
Вероятно, виноват интерпретатор, как эта статья предлагает:
Вы создали одновременно 5 миллионов целых чисел, и каждый объект int потребляет 12 байтов.«Для скорости», Python поддерживает внутренний свободный список для целочисленных объектов.К сожалению, этот бесплатный список бессмертен и неограничен по размеру.float также использует бессмертный и неограниченный свободный список.
Однако проблема остается, так как я не могу избежать такого количества данных (пары меток времени / значений из внешнего источника).Действительно ли я вынужден отказаться от Python и вернуться к C / C ++?
Обновление 2
Возможно, это действительно так, что реализация Python вызываетпроблема.Найден этот ответ , убедительно объясняющий проблему и возможный обходной путь.