【问题标题】:Python - Delete (remove from memory) a variable from inside a function?Python - 从函数内部删除(从内存中删除)变量?
【发布时间】:2017-05-18 14:06:10
【问题描述】:

我必须加载这个巨大的对象A(可以重 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 没有定义为全局变量。

有办法吗?谢谢!

【问题讨论】:

  • 也许如果你从 function() 内部加载 A 开始,你可以利用它只会“存在”直到函数返回的事实,因为它会超出范围...如果我不在这里,请有人纠正我
  • 你有没有试过在调用函数后删除文件
  • 我真的会考虑为这样的任务选择另一个环境 - 没有自动垃圾收集。也许可以不首先加载整个对象?
  • 您很可能以错误的方式处理文件,问题可能在于加载 fn 以及您如何处理文件,而“a”问题只是结果..跨度>

标签: python memory optimization global-variables del


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 在函数内部设置 A = None 不会改变函数外部的 A 在返回后的值。 A = None 仅在本地范围内为 A 设置一个值。
    • 想象人们正在参加大型商务会议或会议。有很多人在他们的衬衫上戴着写有名字的标签/贴纸。这个商务功能有很多人,包括Ms. Sarah,和“Mr. None”。最初,莎拉在她的衬衫上戴着一个名牌,上面写着“A”。执行代码A = None 就像(1)从莎拉女士身上取下“A”姓名标签(2)将“A”姓名标签粘贴到无先生身上。执行代码A = None将Sarah 从约定中删除。之前,莎拉的名牌上写着“A”。
    • 之后,莎拉完全没有名牌,A 名牌被移到了无先生的衬衫上。
    【解决方案3】:

    也许在这里从函数内部加载对象会起作用,因为一旦函数返回,A 将超出范围并且不再以相同的方式占用内存(A 可能仍然存在于内存中,但是该内存现在应该可以在需要时再次用于其他用途)。也许试试 something 像这样:

    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)

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-11-30
        • 2018-05-22
        • 2016-08-16
        • 1970-01-01
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        相关资源
        最近更新 更多