2017-01-04 3 views
3

Мне нужно загрузить этот массивный объект A (который может весить almsot 10go), что мне нужно перейти к функции, которая извлекает из нее параметр B, чтобы еще больше наложить на него тяжелые вычисления.Python - Удалить (удалить из памяти) переменную изнутри функции?

A = load(file) 

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

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

Есть ли способ сделать это? Благодаря!

+0

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

+0

Вы пробовали удалить _file_ после вызова функции? – Jalo

+0

Я бы действительно подумал о выборе другой среды для такой задачи - без автоматической сборки мусора. Может быть, можно вообще не загружать весь объект? –

ответ

0

Возможно, загрузка объекта изнутри функции будет работать здесь, так как 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)

0

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

def function(A): 
    B = transform(A) 
    A = None 
    B = compute(B) 
    return(B) 
+2

Настройка A = Отсутствует внутри функции не меняйте значение A вне функции после его возврата. A = None там задает значение для A в локальной области. – Totem

0

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

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