結婚式の写真が届いたので親戚に届けたい。
けどこれが3MB*700枚=2GBくらいのデータ量となってしまって、これをいきなりダウンロードしてねというのはあまり相手の環境を考慮していないだろう。
塊は塊でダウンロードしてもらうこともできるとして、webブラウザで手軽に見れる方法があってもいいはず。
webブラウザで表示しようとすると全部は無理なのでページングするしかない。
ページングしたとしても一枚で3MBの画像が何十個と並ぶのもイマイチな感じがする。
webブラウザから見る分には画質をある程度落として手軽に見れるようにすると良さそうだ。
高画質版は別途ダウンロードしてねという感じ。
そのためには700枚の画像をimage magickで縮小すればいいけど、この作業も1回だけとは限らないのでプログラマならスクリプト化したい。
以上タテマエ。
以下完成した8並列で700枚の画像を20%にリサイズするスクリプト。
root_path = "../../app/assets/images" from_dir = "all_image" to_dir = "thumb" pids = [] Dir.chdir root_path do Dir.glob("#{from_dir}/*") do |from_path| puts from_path pids << fork do Process.exec(['convert', '-geometry', '20%', from_path, from_path.sub(/all_image/, to_dir)].join(' ')) end if 8 <= pids.length pid,status = Process.wait2 unless pids.delete(pid) fail status.inspect end end end end Process.waitall
かなり適当だけど、これで最大プロセスを8個に抑えつつ並列で処理できる。 一個ずつの時より測ってないけど感覚的にはだいぶ速い。
この感じ、慣れるとスニペット的に使えそう。