Я получаю "утечку памяти" при утечке памяти при запуске:
import gc
temp = [[0.1] for _ in xrange(10 ** 7)]
del temp
gc.collect()
Резидентная память начинается с ~ 7 МБ, увеличивается до ~ 1000 МБ, а затем устанавливается на ~ 312 МБ. Последующие запуски не увеличивают утечку памяти выше 312 МБ. Почему это происходит, и есть ли какие-нибудь известные обходные пути?
Различные наблюдения:
- Это происходит в Ubuntu 14.04, но не в OSX
- Этого не происходит в python3
[[] for _ in xrange(10 ** 7)]
не не утечка
[0.1 for _ in xrange(10 ** 7)]
не не утечка
[(0.1,) for _ in xrange(10 ** 7)]
делает не утечка
[0.1 for _ in xrange(10 ** 7)]
не не утечка
{random.random(): {0.1: 0.1} for _ in xrange(10 ** 7)}
делает утечка
- Очистка отдельных списков по одному не помогает
- Запуск в оболочке python против файла, похоже, не оказывает влияния
- Я воспроизвел поведение в версиях Python: 2.7.15, 2.7.14, 2.7.11 и 2.7.5
Моя первая интуиция состояла в том, что это вызвано тем, что арены не очищаются. Но это не имело смысла, потому что я ожидал бы того же поведения с [0.1 for _ in xrange(10 ** 7)]
, но этого не происходит.
Почему вложение списка / словаря приводит к такому поведению верхней отметки?
Я в основном измеряю резидентную память, используя htop