Python - 从函数内部删除(从内存中删除)变量?

时间:2017-01-04 10:09:47

标签: python memory optimization global-variables del

我必须加载我需要传递给函数的这个大型对象A(可以对almsot 10go进行加权),该函数从中提取参数B以进一步对其执行一些繁重的计算

A = load(file)

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

为了释放一些内存(因为我已经有一个MemoryError),我想在转换为B后立即从内存中删除A。 我尝试了del,但它似乎并没有影响脚本级A的存在。我也试过del global()["A"],但它说A没有定义为全局变量。

有办法吗?谢谢!

4 个答案:

答案 0 :(得分:1)

del A只会从A的本地范围中删除function(请参阅this answer)。 A仍然会在全球范围内持续存在。要将其从全局范围中删除,您可以使用闭包(并声明global A)或使用python3,也可以使用关键字nonlocal。但是,这仅从范围中删除绑定,并不保证释放相应的内存。当对象垃圾收集时会发生这种情况。您可以通过gc模块强制进行垃圾回收(请参阅this answer)。

但是,如果您遇到内存问题,而不是加载整个数据集,您可以使用视图到数据集,并且一次只处理(加载)它的一部分(即流处理数据) )。

答案 1 :(得分: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)

答案 2 :(得分:0)

我相信在函数中重新分配A可以达到你想要的效果。

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

答案 3 :(得分:0)

将外部变量声明为全局变量

a = 1

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

func()
print(a)