【问题标题】:Python: Memory LeakPython:内存泄漏
【发布时间】:2014-02-26 18:27:21
【问题描述】:

我正在使用 Python 在 LCD 显示器 (Raspberry Pi) 上显示位图图像。这工作得很好,但似乎我给自己造成了巨大的内存泄漏。 这段代码似乎是罪魁祸首:

def displayBitmap(self):
    spi.open(0,0)
    f = open("data/565.bmp", "rb")
    imgdata = f.read()
    f.close()

    self.setAddress(0, 0, LCD_WIDTH-1, LCD_HEIGHT-1)
    k = 0
    for i in range(0, (LCD_WIDTH*LCD_HEIGHT)):
        dt = (ord(imgdata[k]) | (ord(imgdata[k+1]) << 8))

        self.spiOutData(dt,2)
        k +=2
    imgdata = None
    spi.close()

...

def spiOutData(self, data, bytes=1):
    io.digitalWrite(15, io.LOW)
    io.digitalWrite(16, io.HIGH)

    io.digitalWrite(self.dcPin, io.HIGH)

    if (bytes == 1):
        spi.xfer2([(data)])
    else:
        spi.xfer2([(data>>8)])
        spi.xfer2([(data)])

它在一段时间内运行良好,但在某些时候由于内存不足而终止。我的猜测是imgdata 的内容永远不会被删除,但我的 Python 知识似乎太糟糕了,无法找到原因。 请给我一个提示好吗?非常感谢。

【问题讨论】:

  • imgdata = None完全没用。 Python 有自己的垃圾收集器,确实知道如何完成它的工作。当函数完成时,无论如何都会删除该引用,因此这种语句的 only 效果会减慢您的代码一点。也许imgdata 中的数据没有被释放,但您可以 100% 确定它不是该引用的错误。程序的其他部分可能会以某种方式获取对它的引用(尽管很奇怪)。 -1 表示不提供完整的回溯。
  • 感谢您的回答。我是这么认为的,我只添加了imgdata = None 用于测试目的,因为正如我所说,我很无知。这是整个代码,但我发布的几乎是所有发生的事情:nopaste.info/9c65fb9840.html我现在无法提供回溯,因为内存需要相当长的时间才能充满,但我会尽快提供因为它再次发生。
  • 对于遇到相同问题的任何人:这似乎是由于 spidev 库中的错误。 (对spi.xfer2 的调用导致内存泄漏)
  • 如果你确定你应该发布你自己的答案并接受它。

标签: python memory memory-leaks garbage-collection garbage


【解决方案1】:

所以这是我发现的:

  • py-spidev 模块(或 spidev 本身的某些部分)似乎是问题所在。
  • 除了内存泄漏之外,py-spidev 速度非常慢

我现在摆脱了py-spidev 并直接通过文件句柄写入/dev/spidev0.0。不再需要过多的内存使用,SPI 通信现在需要大约两秒钟,这大约是之前所需时间的十分之一。

【讨论】:

猜你喜欢
  • 2012-12-02
  • 2011-12-13
  • 2010-11-27
  • 2015-02-15
  • 1970-01-01
  • 2021-12-04
  • 2021-01-10
  • 2017-10-18
  • 2010-11-23
相关资源
最近更新 更多