我必须加载我需要传递给函数的这个大型对象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没有定义为全局变量。
有办法吗?谢谢!
答案 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)