[英]Python memory leak when converting and saving numpy array as image
我有一个简单的设置:
生产者从相机读取一组图像,然后使用numpy.row_stack()将它们连接起来。 产生的数组放入Queue.Queue。
使用者不断使用Queue.get()等待数据,并且一旦接收到数据,就会将图像保存到文件中。 无论出于何种原因,该进程都会泄漏内存,就像没有明天一样。
如果我不将图像放入线程队列,则不会发生泄漏。
显然不是队列在泄漏,而是保存图像功能中的某些东西。
特别是在创建临时文件部分中。
这是实现:
def _createTmpFile(self, image):
filename = '/tmp/imgTemp.gray'
with open(filename, 'wb') as fp:
scaled = image * 16
big = numpy.asmatrix(scaled, dtype='>i2')
fp.write(big.tostring())
return filename
def _saveImage(self, filename, image):
tmpFile = self._createTmpFile(image)
try:
# Call a blocking sub process command to convert the image:
command = ('convert -size %dx%d -depth 16 -endian MSB' % ( image.shape[1], image.shape[0])).split(' ')
command += [tmpFile, '/tmp/' + os.path.basename(filename)]
log.debug("command being called: %s" % str(command))
subprocess.call(command)
os.unlink(tmpFile)
log.info("Image %s is saved." % filename)
except Exception as e:
log.exception()
log.warning("Failed to save image %s" % filename)
我看不到有什么特别的东西引起我的注意,这会导致内存泄漏。 有任何想法吗?
更新:经过彻底的分析后,问题变得非常简单-生产者创建图像的速度比消费者保存图像的速度快得多,从而填满了队列。 当我取消对图像的请求时,我会耗尽队列,但是GC似乎不够快,无法拾取大量图像,因此它们阻塞了内存。
subprocess.call()就是原因,您应该在其中放置一个wait左右的命令,和/或让它进入一个新的终端,并带有一些kwarg。 因为否则启动了调用,并且比队列稍后执行了类似的操作(使用命令行处理子过程比较棘手)
我认为带有shell = True的check_call()应该起作用,而不是subprocess.call,但是我也不完全确定。 我曾经有过类似的问题,并且我认为可以解决它
另一个原因可能是,在队列中,如果多次调用createTmpFile,则会写入同一个临时映像,因此多个映像会相互覆盖等等? 我猜这可能导致记忆泄漏
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.