Почему у вложенных списков утечка памяти в Ubuntu 14.04? - PullRequest
0 голосов
/ 09 мая 2018

Я получаю "утечку памяти" при утечке памяти при запуске:

import gc
temp = [[0.1] for _ in xrange(10 ** 7)]
del temp
gc.collect()

Резидентная память начинается с ~ 7 МБ, увеличивается до ~ 1000 МБ, а затем устанавливается на ~ 312 МБ. Последующие запуски не увеличивают утечку памяти выше 312 МБ. Почему это происходит, и есть ли какие-нибудь известные обходные пути?

Различные наблюдения:

  1. Это происходит в Ubuntu 14.04, но не в OSX
  2. Этого не происходит в python3
  3. [[] for _ in xrange(10 ** 7)] не не утечка
  4. [0.1 for _ in xrange(10 ** 7)] не не утечка
  5. [(0.1,) for _ in xrange(10 ** 7)] делает не утечка
  6. [0.1 for _ in xrange(10 ** 7)] не не утечка
  7. {random.random(): {0.1: 0.1} for _ in xrange(10 ** 7)} делает утечка
  8. Очистка отдельных списков по одному не помогает
  9. Запуск в оболочке python против файла, похоже, не оказывает влияния
  10. Я воспроизвел поведение в версиях Python: 2.7.15, 2.7.14, 2.7.11 и 2.7.5

Моя первая интуиция состояла в том, что это вызвано тем, что арены не очищаются. Но это не имело смысла, потому что я ожидал бы того же поведения с [0.1 for _ in xrange(10 ** 7)], но этого не происходит.

Почему вложение списка / словаря приводит к такому поведению верхней отметки?

Я в основном измеряю резидентную память, используя htop

...