Код: Выделить всё
l = [i for i in range(int(1e8))]
l = []
import gc
gc.collect()
# 0
gc.get_referrers(l)
# [{'__builtins__': , 'l': [], '__package__': None, 'i': 99999999, 'gc': , '__name__': '__main__', '__doc__': None}]
del l
gc.collect()
# 0
Вот отрывок из вывода 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
Код: Выделить всё
moooeeeep 5478 1.0 29.7 2454720 2413516 pts/2 S+ 12:39 0:09 /usr/bin/python /usr/bin/ipython gctest.py
Не все элементы в некоторых свободных списках могут быть освобождены из-за конкретной реализации, в частности int и float.
Означает ли это, что если мне (временно) понадобится большое количество различных int или float, мне нужно экспортировать это в C/C++, потому что сборщик мусора Python не может освободить память?
Обновить
Вероятно виноват переводчик, как подсказывает эта статья:
Вы создали 5 миллионов целые числа одновременно живы, и каждый объект int занимает 12 байт. «Для скорости» Python поддерживает внутренний свободный список для целочисленных объектов. К сожалению, этот бесплатный список бессмертен и неограничен по размеру. float также использует бессмертный и неограниченный свободный список.
Однако проблема остается, поскольку я не могу избежать этого объема данных (метка времени/значение пары от внешнего источника). Действительно ли я вынужден отказаться от Python и вернуться к C/C++?
Обновление 2 >
Возможно, действительно, проблема связана с реализацией Python. Нашел этот ответ, убедительно объясняющий проблему и возможный обходной путь.
Подробнее здесь: https://stackoverflow.com/questions/961 ... tion-fails
Мобильная версия