#python #python-2.7 #memory-leaks #garbage-collection
Вопрос:
Когда я использую функцию диапазона, она навсегда занимает память, даже если я удаляю и запускаю gc.collect()
import gc import time a = range(int(1e8)) del a gc.collect() time.sleep(30)
Я использую htop для мониторинга и вижу, что они навсегда заняли много памяти. Это происходит только на ubuntu16.04 (macos-нет). Есть идеи, почему это происходит?
Комментарии:
1. В python 2.7
range
создается список (поэтому при определении вы выделяете много памятиa
). Используйтеxrange
для выполнения ленивой итерации и избегания выделения списка целых чисел между 0 и1e8
вместо этого. Python 3 заменяетrange
, чтобы всегда вести себя такxrange
.2. @GPhilo у меня есть упоминание (а также в коде) Я удалил переменную, сохранив этот диапазон, так что это означает, что я уже удалил этот список.
3. CPython внутренне освобождает память, но не возвращает ее ОС.
Ответ №1:
Спасибо @Klaus D. ответьте, я все понял.
Диапазон создайте список указателей, каждый из которых указывает на объект. Дель «а» освободит этот список и вернет память. Он также использует все объекты int, но эти небольшие объекты не возвращаются в ОС, потому что python управляет выделением небольшой памяти сам по себе.