繁体   English   中英

将numpy数组转换并保存为图像时,Python内存泄漏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM