[ruby-list:50923] Re: RMagic でキャッシュリソースあふれを回避したいのですが

From: konami <konami@...>
Date: 2021-03-16 09:00:51 UTC
List: ruby-list #50923
坂根さま,さっそくありがとうございます。

いただいたヒントを元にソースに手を入れました。
まず,img.destroy! 
を追加したところループ回数が増えたので,どこかでまだメモリを食っているのだろうと思って,
rotate で生成した img2 も destroy! 。これで通ったので,その前に 
writeで書き戻して望みの結果になりました。

小波秀雄

require "rmagick"
parity = 0
Dir.glob("*jpeg").sort.each do |jpg|
   /(\d*)\.j/ =~ jpg
   if $1.to_i % 2 == parity
     puts jpg
     img = Magick::Image.read(jpg)[0]
     img2 = img.rotate(180)
     img.destroy!
     img2.write(jpg)
     img2.destroy!
   end
end


On 2021/03/16 15:04, 坂根佑介 wrote:
> 初めまして。坂根と申します。
>
> Magick::Image.read の呼び出しに対して、closeに纏わる処理を呼び出されていないことが気になりました。
> Magick::Image#destroy! を使ってみられてはいかがでしょうか。
>
> https://www.rubydoc.info/gems/rmagick/Magick%2FImage:destroy!
>
> 未検証の中の回答で恐縮ですが、何か解決のヒントに繋がると幸いです。
>
> 2021年3月16日(火) 13:42 konami <konami@kyoto-wu.ac.jp>:
>> いつもお世話になっています。表題の通りです。
>> 大量のスキャンデータを処理するためにRMagickを使おうとして失敗してしまいました。
>>
>> ソース:
>> require "rmagick"
>> parity = 0
>> Dir.glob("*jpeg").each do |jpg|
>>     /(\d*)\.j/ =~ jpg
>>     if $1.to_i % 2 == parity
>>       puts jpg
>>       img = Magick::Image.read(jpg)[0]
>>       img.rotate(180)
>>     end
>> end
>>
>> ナンバリングされているファイルのうち偶数番のファイルを180度回転させようというものですが,
>> 走らせると途中で止まります。
>>
>>   > ./rotateImage.rb
>> Check0002.jpeg
>> (中略)
>> Check0010.jpeg
>> Traceback (most recent call last):
>>       3: from ../rotateImage.rb:4:in `<main>'
>>       2: from ../rotateImage.rb:4:in `each'
>>       1: from ../rotateImage.rb:8:in `block in <main>'
>> ../rotateImage.rb:8:in `read': cache resources exhausted
>> `Check0010.jpeg' @ error/cache.c/OpenPixelCache/4083
>> (Magick::ImageMagickError)
>>
>> このエラーは ImageMagick
>> が設定している最大のキャッシュを使い切ってしまうということのようで,設定ファイルをいじって
>> 1 GiB に増やしましたが,解決にはなりませんでした。
>> https://blog.myanote.com/post/529
>>
>> ファイルを処理したらメモリを開放する方法でもないのかと思ってRMagickのドキュメントを見たのですが,分かりませんでした。
>>
>> https://rmagick.github.io/usage.html
>>
>> せっかくRubyから使えるのなら利用したいのですが,何か方法はないものでしょうか。ヒントでもいただけると幸いでです。
>>
>> 小波秀雄
>>

In This Thread

Prev Next