Автоматическое освобождение памяти больше не используемых переменных в python - PullRequest
0 голосов
/ 19 марта 2020

Я новичок в Python. Допустим, я использую большие pandas фреймы данных. Мой код выглядит примерно так:

all_data = pd.read_csv(huge_file_name)
part_data = all_data.loc['ColumnName1', 'ColumnName2','ColumnName3']
data_filtered = part_data.loc[:,part_data['ColumnName2']==-1]

и так далее. Каким-то образом python может удалить all_data, part_data и другие переменные, которые больше не используются? Я могу написать del var_name, но это изменит код, чтобы быть очень грязным. Также я могу использовать для всех переменных одно и то же имя, но оно также выглядит не очень хорошо. Спасибо всем заранее!

1 Ответ

1 голос
/ 19 марта 2020

Ключевое слово del - способ сделать это; Я не уверен, что многое нужно сделать для того, чтобы вы сделали код «грязным». Python людям нравится говорить, что явный лучше, чем неявный , и это будет его примером.

В противном случае объявляйте промежуточные переменные в области действия функции и пространство, используемое этими переменные будут освобождены (или, скорее, помечены для «сборки мусора»; см. ниже), когда функция завершится.

Так что вы можете:

import gc

all_data = pd.read_csv(huge_file_name)
part_data = all_data.loc['ColumnName1', 'ColumnName2','ColumnName3']
data_filtered = part_data.loc[:,part_data['ColumnName2']==-1]

del all_data, part_data

# and if you're impatient for that memory to be freed, like RIGHT now
gc.collect()

Или вы можете :

import gc

def filter_data(infile):
    all_data = pd.read_csv(infile)
    part_data = all_data.loc['ColumnName1', 'ColumnName2','ColumnName3']
    return part_data.loc[:,part_data['ColumnName2']==-1]

data_filtered = filter_data(huge_file_name)

# force out-of-scope variables to be garbage collected RIGHT now
gc.collect()

Ключевое слово del освобождает переменную из локальной области видимости, так что она может (в конечном итоге) собирать мусор, но память освобождается, когда переменные go выходят из области видимости, и не могут быть немедленно возвращены операционная система. Поток SO AM C содержательно указал на вас с подробностями.

Стратегии сбора мусора являются предметом информатики PhD-уровня, но моя интуиция заключается в том, что G C запускается только тогда, когда существует некоторое «давление» во время выполнения Python для освобождения памяти; как в новых объявлениях переменных, которые должны были бы использовать некоторое количество памяти, ранее использовавшейся переменными вне области видимости.

Вы были осторожны, чтобы указать, что это большой файл CSV, читаемый в один (Pandas) структура данных, но следует помнить о том, что переменные, выходящие за пределы области действия, обычно автоматически собираются мусором, и обычно вам не нужно самостоятельно управлять этим процессом .

Здесь - некоторый фон для сбора мусора в Python, который вы можете найти осветительным, а здесь - обсуждение других случаев, когда del полезен (например, удаление фрагментов из списка).

...