Python-Wand序列无法从内存中清除

时间:2015-05-07 12:20:57

标签: imagemagick wand

如果我执行以下操作

for root, dirs, files in os.walk(myDir):
  for myFile in files:
    with Image(filename=myFile) as img:
      with Image(image=img) as main:
        print main.sequence[0].width

我最后使用Wand导致内存故障。

我确定它的.sequence部分。如果我删除它,它的罚款。我已经阅读了所有我能在序列上找到的内容,它是一个Image vs SingleImage。

SingleImage序列部分保留在内存中。我试过使用以下内容:

main.sequence[0].destroy()

但它没有摆脱内存中的图像。

我正在处理数千个文件,但是在几十个文件之后我就会出现分段错误。

我很确定它关闭了'主'图像。只是不是main.sequence SingleImage。

有没有办法强制关闭它?

我应该说我也试过这个

with Image(image=img.sequence[0]) as main:

认为With语句会间接关闭它。但事实并非如此。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

首先要做的事 - 提交bug with wand。如果分配了图像序列,则wand.image.Image.destroy不会清除wand.image.Sequence很好找!

你对main.sequence[0].destroy()绝对正确;但是,您只能释放序列中第一个分配的SingleImage。所以img.sequence[1:]仍在记忆中。一个不那么优雅的解决方案是迭代&摧毁所有SingleImage

for root, dirs, files in os.walk(myDir):
  for myFile in files:
    with Image(filename=myFile) as img:
      with Image(image=img) as main:
        first = True
        for frame in main.sequence:
           if first:
             print frame.width
             first = False
           frame.destroy()

评论:将图像从文件读取到img,将数据复制到main,并按顺序创建子图像似乎非常耗费内存。我确定你做的不仅仅是识别图像宽度,还可以重写吗? Imagemagick确实有一个ping方法(尚未在wand中实现),它不会将图像数据读入内存。