2009年12月22日
RMagickでメモリリークが発生する
なぜメモリリークが発生するのか
そもそも、RubyにはGCがあるので自然に開放されるはずです。しかし、実際にはそうなっていません。これには下記のような理由があります。
RMagickはImageMagickのobj(mallocで確保した)を扱っていて、これはRubyのobjではありません。そのため、GCの対象にならず、メモリリークの危険性をはらむ事になります。
対策
対策1〜3の順でおすすめと思います。
対策1(RMagickとImageMagickのバージョン変更ができる場合)
RMagick 2.10.0で変更された下記に頼る。
- (Experimental) Support the use of Ruby managed memory for all memory allocations (available in ImageMagick 6.5.3-10)
対策2(バージョン変更できない場合)
http://rubyforge.org/forum/forum.php?thread_id=1374&forum_id=1618にあるように、Magick::Image#destroy!を明示的に呼ぶ。
require 'RMagick' include Magick pics = Dir["*.jpg"] pics.each do |pic| img = Image.read(pic).first # process new image img.destroy! end
対策3(アーキテクチャ選定前)
競合製品を使ってみる。
MiniMagickの特徴
- 薄いラッパー
- ImageMagickのAPIを呼び出すだけ
- なので、MiniMagickのドキュメントを覚える必要が無い
- ImageMagickのobjを使用しない
- なので、メモリリークが起こりえない
- 代わりに処理のたびに一時ファイルを作成する
- なので、遅い
MagickWandの特徴
- RMagickの作者が作った
- 作者曰く "RMagick rebooted."
- 後発なので、今後はこちらが主流になる?
補足
メモリリークの検出には、Bleak House pluginが使いやすくておすすめです。
トラックバック - http://d.hatena.ne.jp/DianthuDia/20091222/p1
リンク元
- 48 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=om4&q=rmagick+メモリリーク&btnG=検索&lr=lang_ja&aq=0r&oq=rmagick+めもり
- 24 http://www.google.co.jp/search?hl=ja&safe=off&client=firefox-a&hs=Rvi&rls=org.mozilla:ja:official&q=mac+foobar&btnG=検索&lr=lang_ja&aq=f&oq=
- 24 http://www.google.co.jp/search?q=foobar2000+mac&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:unofficial&client=firefox-a
- 20 http://b.hatena.ne.jp/entry/d.hatena.ne.jp/DianthuDia/20080911/1221140796
- 20 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGLJ_jaJP322JP322&q=python+datetime+sleep
- 18 http://www.google.co.jp/search?hl=ja&source=hp&q=foobar2000+mac&lr=&aq=0&oq=
- 17 http://twitter.com/dianthudia
- 16 http://www.google.co.jp/search?q=capistrano+passenger&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:ja:unofficial&client=firefox-a
- 16 http://www.google.co.jp/search?q=foobar+mac&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox-a
- 16 http://www.google.co.jp/search?q=foobar2000+mac&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja-JP-mac:official&client=firefox-a


