如果我执行以下操作
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语句会间接关闭它。但事实并非如此。
有人可以帮忙吗?
答案 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
中实现),它不会将图像数据读入内存。