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 に答える