【发布时间】: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