7

如果我执行以下操作

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 与 SingleImage 的区别。

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

main.sequence[0].destroy()

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

我正在处理数千个文件,但只处理了几十个文件就出现了分段错误。

我很确定它会关闭“主要”图像。只是不是 main.sequence SingleImage。

有没有办法强制关闭它?

我应该说我也试过这个

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

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

任何人都可以帮忙吗?

4

1 回答 1

1

首先要做的事情是使用 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),它不会将图像数据读入内存。

于 2015-05-07T16:10:02.753 回答