【问题标题】:Python memory explosion with embedded functions带有嵌入式函数的 Python 内存爆炸
【发布时间】:2015-01-16 03:54:01
【问题描述】:

我使用 Python 有一段时间了,有时会遇到一些内存爆炸问题。我已经搜索了一些资源来解决我的问题,例如 Memory profiling embedded pythonhttps://mflerackers.wordpress.com/2012/04/12/fixing-and-avoiding-memory-leaks-in-python/https://docs.python.org/2/reference/datamodel.html#object.del 但是,它们都不适合我。

我目前的问题是使用嵌入式函数时内存爆炸。以下代码可以正常工作:

class A:
  def fa:
    some operations
    get dictionary1
    combine dictionary1 to get string1
    dictionary1 = None
    return *string1*

  def fb: 
    for i in range(0, j):
      call self.fa
      get dictionary2 by processing *string1* 
      # dictionary1 and dictionary2 are basically the same. 
      update *dictionary3* by processing dictionary2
      dictionary2 = None
    return *dictionary3*

class B:
  def ga: 
    for n in range(0, m):
      call A.fb # as one argument is updated dynamically, I have to call it within the loop 
      processes *dictoinary3*
    return something

当我注意到我不需要将 dictionary1 组合到 string1 时,就会出现问题,我可以直接将 dictionary1 传递给 A。 FB。我是这样实现的,然后程序变得非常慢,内存使用量爆炸了10多倍。我已经验证了这两种方法都返回了正确的结果。

有人可以提出为什么这么小的修改会导致如此大的差异吗?

以前,我在对多源树(具有 100,000 多个节点)中的节点进行分级时也注意到了这一点。如果我从源节点(可能具有最大高度)开始进行平整,则内存使用量是从可能具有最小高度的源节点开始的 100 倍。虽然练级时间差不多。

这让我困惑了很长时间。提前非常感谢您!

如果有人感兴趣,我可以通过电子邮件将源代码发送给您,以获得更清晰的解释。

【问题讨论】:

    标签: python memory-management memory-leaks


    【解决方案1】:

    您正在解决相同的问题这一事实不应暗示解决方案的效率。排序数组也可以解决同样的问题:您可以使用冒泡排序O(n^2),或合并排序O(nlogn),或者,如果您可以应用一些限制,您可以使用非比较排序算法,如基数或桶排序具有线性运行时间。

    从不同节点开始遍历会产生不同的遍历图的方式——其中一些可能效率不高(重复节点更多次)。

    至于“将字典 1 与字符串 1 组合” - 这可能是一个非常昂贵的操作,并且由于该函数被递归调用(多次) - 性能可能会明显变差。但这只是一个有根据的猜测,如果没有更多关于这些函数中执行的操作的复杂性的详细信息,就无法回答。

    【讨论】:

    • 基于我在数据结构和算法方面受过教育的知识,我完全同意你的看法。我不明白的是,通过消除合并然后分离的过程,我将在 CPU 时间或内存使用方面获得改进,但是,它们都变得更糟......
    • 我们可以推测 - 但它不会有成效。最好尝试使用分析器来了解性能差异。
    • 嗨,alfasin,我已经找到原因了。最后是因为修改实现后,有些数据格式并不严格一致。该程序花了很多时间来区分它们。感谢您提醒我使用分析器!
    猜你喜欢
    • 2018-11-25
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2015-06-11
    • 2016-02-08
    • 1970-01-01
    相关资源
    最近更新 更多