【问题标题】:Memory never released when using Python classes and numpy使用 Python 类和 numpy 时从未释放内存
【发布时间】:2011-08-23 05:43:01
【问题描述】:

基本上我不会在这里发布所有代码,但我会提供一个通用示例。我有一个类,它具有运行和创建大量值的函数。根据我的估计,这个数组不应该超过 10MB。在函数中,它会创建新的并修改应该在 train 中的函数运行后收集的数组。除了放入大数组的返回 tempArray 之外,它们不会在其他地方使用。这是重复的。使用的内存不断增长。我的代码是否存在问题或解决此问题的方法。我在这里阅读了有关 Linux 中 malloc 的内存泄漏的信息: http://pushingtheweb.com/2010/06/python-and-tcmalloc/.

【问题讨论】:

  • 10MB?在 32 位平台上,1000*1000*10*20*4(每个 int 4 字节)= 800MB。如果您的系统是 64 位,则加倍。
  • 我的错误,numpy.zeros 默认使用 float64。所以在任何平台上都是 1.6GB。 docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html
  • 您可以使用zeros((1000,1000,10,20), dtype=float32)将其大小保持在800MB
  • 请展示一个可运行的示例。也许您的估计值有误?
  • 如果您无法共享您的代码,请创建一个可运行的示例(最好是简短的),它会导致与您相同的问题。重新告诉我们您的代码做了什么并不能帮助我们找出问题所在。您可能有错误,或者可能存在错误,但没有任何代码来重现该问题,我们只能说“嗯,它对我来说很好”。

标签: python numpy malloc scipy tcmalloc


【解决方案1】:

你想做什么?

temp = self.largeArray = zeros((1000,1000,10,20))
for y in temp.size:
    for x in temp1.size:
        self.largeArray[x,y] = train()

temp.size 等于 200,000,000。如果这个数组的第二维只有 1000,你怎么能把任何东西存储到 largeArray[x,y] 中?

【讨论】:

  • 对不起,我放的那个数组没有考虑实际尺寸。实际维度是一个四维数组(67,12,300,30)。
  • 假设 a = temp.shape。然后 temp.size 应替换为 a[0] (67), temp1.size 应替换为 a[1] (12)。然后 train 返回一个 numpy 数组,即 (300,30)。这被分配给 self.largeArray 的部分,如上所示。如果您需要更多说明,请告诉我。我可以发送更多我无法公开发布的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
相关资源
最近更新 更多