rubyで画像のリサイズを簡単に行う目的であれば、通常、ImageMagickのrubyバインディングであるRMagickを利用することになる。
しかしながら、RMagickにて何も考えずにリサイズ処理を行っていくとメモリの消費量がありえないほど増えていく。ゆうにシステム全体の90%まで食いつぶす。他のサイトでも言及しているが、これはリークしているとしか思えない。
これでは仕方がないので、convertを直で叩くようにプログラムしたのだが、これはこれで遅い。CPUを利用する遅さではなく、プロセスを生成している重さなのだろうか。nice値を下げても、他のCGIのプロセスに干渉して遅くしてしまう。
どうにかならないか調べたところ、
磁力式駆動: RMagickのメモリーリーク対策。にあるように
def run_gc
fDisabled = GC.enable
GC.start
GC.disable if fDisabled
end
を、リサイズ処理が終了してRMagickのクラスにnilを突っ込んだ後に行ったところ、メモリの増加は抑えられるようになった。代わりにCPUを100%近く遷移するようになったが、もともと複数枚の画像の処理により処理が連続しているためにそうなっているのだろう。別のプロセスに対してもnice値が効いているのか露骨に遅くなることはなくなった。
連続で処理を行う場合は、やはりライブラリがよろしい。