Python – удалить (удалить из памяти) переменную внутри функции?

Я должен загрузить этот массивный объект A (который может весить почти 10 гол), который мне нужно передать функции, которая извлекает из него параметр B для дальнейших тяжелых вычислений.

A = load(file)

def function(A):    
   B = transorm(A)    
   B = compute(B)
   return(B)

Чтобы освободить часть памяти (поскольку у меня уже была ошибка MemoryError), я хотел бы удалить A из памяти сразу после ее преобразования в B. Я пробовал del, но, похоже, это не влияет на существование A на уровне скрипта. . Я также пробовал del global()["A"], но он говорит, что A не определена как глобальная переменная.

Есть ли способ сделать это? Спасибо!


person Dominique Makowski    schedule 04.01.2017    source источник
comment
Возможно, если вы загрузите A изнутри функции () для начала, вы могли бы воспользоваться тем фактом, что он будет «существовать» только до тех пор, пока функция не вернется, поскольку тогда он выйдет за пределы области видимости... кто-нибудь поправьте меня, если я я здесь   -  person Totem    schedule 04.01.2017
comment
Вы пытались удалить файл после вызова функции?   -  person Jalo    schedule 04.01.2017
comment
Я бы очень задумался о выборе другого окружения для такой задачи — без автоматической сборки мусора. Может быть, можно не загружать весь объект в первую очередь?   -  person    schedule 04.01.2017
comment
скорее всего, вы работаете с файлом неправильно, проблема может быть в загрузке fn и в том, как вы обрабатываете файл, а проблема - это просто результат.   -  person Vitaliy Terziev    schedule 04.01.2017


Ответы (4)


del A просто удалит A из локальной области действия function (см. этот ответ). A по-прежнему будет сохраняться в глобальной области видимости. Чтобы удалить его из глобальной области, вы можете либо использовать замыкание (и объявить global A), либо с python3 вы также можете использовать ключевое слово nonlocal. Однако это только удаляет привязку из области действия и не гарантирует освобождение соответствующей памяти. Это происходит, когда объект собирается мусор. Вы можете форсировать сборку мусора через модуль gc (см. этот ответ).

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

person a_guest    schedule 04.01.2017

Я считаю, что переназначение A внутри функции может достичь желаемого эффекта.

def function(A):
    B = transform(A)
    A = None
    B = compute(B)
    return(B)
person Kumar    schedule 04.01.2017
comment
Установка A = None внутри функции не изменит значение A вне функции после ее возврата. A = None устанавливает только значение для A в локальной области. - person Totem; 04.01.2017
comment
Представьте людей, что вы находитесь на большом деловом съезде или собрании. Многие люди носят бирки/наклейки с именами на рубашках. На этом деловом мероприятии много людей, в том числе мисс Сара и мистер Нон. Изначально у Сары на рубашке бирка с именем, на которой написано A. Выполнение кода A = None похоже на (1) снятие бейджа A с мисс Сары (2) приклеивание бейджа A к мистеру Нет. Выполнение кода A = None не удаляет Сару из соглашения. Раньше на бейджике Сары было написано: А. - person Samuel Muldoon; 30.09.2020
comment
После этого у Сары вообще нет бирки с именем, A бирка с именем перемещается на рубашку мистера Но. - person Samuel Muldoon; 30.09.2020

Возможно, здесь сработает загрузка объекта изнутри функции, так как A выйдет за пределы области действия после возврата функции и больше не будет занимать память таким же образом (A, вероятно, все еще будет существовать в памяти, но теперь эта память должна быть доступна для другого использования снова, когда это необходимо). Может быть, попробуйте что-нибудь вроде этого:

f = file                 # assuming file is not the memory hog

def function_A(file):
    A = load(file)       # A is created in the local scope of the function
    return transform(A)  # A will go out of scope, freeing the memory for use

def function_B(file): 
   B = function_A(file)  # when this returns the memory should be available again
   return compute(B)

Тогда просто позвоните function_B(file)

person Totem    schedule 04.01.2017

объявить внешнюю переменную глобальной

a = 1

def func():
    global a
    print(a)
    del a

func()
print(a)
person probhonjon    schedule 26.07.2019