Освобождение всей используемой памяти в python - PullRequest
0 голосов
/ 20 января 2019

Установка:

Я использую код Python, где:

  1. Я открываю файл.
  2. Для каждой строки в файле я создаю объект
  3. Выполнить некоторые операции с объектом

Обратите внимание, что, как только я закончу с операцией, мне больше не нужен объект. Каждая новая строка независима.

Соответствующий код согласно запросу:

Я прокомментировал все части моего кода, оставив ниже следующий код:

import gc
for l in range(num_lines):
    inp = f.readline()[:-1]
    collector = [int(i) for i in inp]
    M = BooleanFunction(collector)
    deg = M.algebraic_degree()
    del M
    gc.collect()

Проблема :

Объект, однажды созданный, потребляет некоторое количество памяти. После выполнения операций я не могу его освободить. Поэтому при циклическом перемещении файла моя память продолжает накапливаться новыми объектами, и примерно на 793 строки в файле мои 16 ГБ ОЗУ полностью истощаются.

Что я пробовал:

Использование сборщика мусора:

import gc del Object gc.collect()

Однако сборщик мусора не освободит ОЗУ (или) питон не отдает память системе. Создание дочерних процессов - идея, но не то, ради чего я готов.

Вопросы:

  1. Можно ли как-нибудь освободить всю память, занимаемую программой в данный момент, для ОС? Это означает удаление всех переменных (циклических переменных, глобальных переменных и т. Д.). Что-то похожее на то, что происходит, когда вы нажимаете CTRL + C для завершения программы, она возвращает всю память в ОС.
  2. Способ специально отменить выделение объекта (если я делаю это неправильно).

Предыдущие вопросы не отвечают на вопрос, что если gc.collect () не может это сделать, и как мне полностью отказаться от выделенной памяти.

1 Ответ

0 голосов
/ 20 января 2019

Объекты в Python могут быть собраны сборщиком мусора, как только их счетчик ссылок упадет до нуля.

Глядя на ваш код, каждая переменная переопределяется в каждой итерации.Так что их счетчик ссылок должен быть равным нулю.

Если этого не произойдет, я вижу три основных варианта:

  1. Вы невольно сохраняете ссылку наэтот объект.
  2. Сборка мусора отключена (gc.disable()) или заморожена (gc.freeze() в Python 3.7).
  3. Объекты создаются расширением Python, написанным на C, который управляет своим собственнымпамять.

Обратите внимание, что (1) или (2) не обязательно должно быть в вашем коде.Это также может произойти в используемых вами модулях.

В вашем случае (2) не должно быть проблемой, так как вы принудительно собираете мусор.

Для примера (1) рассмотрим, чтопроизойдет, если BooleanFunction было запомнено .Тогда ссылка на каждый объект (который вы не увидите и не можете удалить) будет сохранена.

Единственный способ вернуть всю память обратно в ОС - завершитьprogram.

Edit 1:

Попробуйте запустить вашу программу с включенными флагами отладки сборки мусора (gc.DEBUG_LEAK).Запустите gc.get_count() в конце каждого цикла.И, возможно, gc.garbage().

Для лучшего понимания того, где происходит распределение памяти и что именно происходит, вы можете запустить свой скрипт под отладчиком Python .Пошагово просматривайте программу, следя за размером резидентного набора процесса Python с помощью ps в другом терминале.

...