утечка памяти диапазона функций python2.7() в ubuntu

#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 управляет выделением небольшой памяти сам по себе.