読者です 読者をやめる 読者になる 読者になる

TIFFファイルを圧縮してストレージを節約

画像処理

大量画像処理や映像制作を日常的に行っていると、あっという間にストレージが枯渇する。

私の場合、主にSSDで作業を行い、処理完了後にInput・トランザクション・Outputの一式を退避先の外部HDDに格納している。このユースケースでは、同時に複数の外部HDDを利用することは無いため、外部HDDが枯渇したら、外部HDDだけを交換する。これを可能にするため、同一メーカーの同一シリーズの外付けHDDで統一し、ACアダプタ等の電源周りをいちいち交換する面倒を避けている。

だが、最近その製品シリーズが顕著に値上がりしており、別の製品を導入しようかと迷っている。そうしている間にも、日々ストレージの空き容量は逼迫しつつある。
ここから本題なのだが、空き容量が無いなら使用容量を減らせばいいじゃない。という考え方もある。要するに、捨てるか圧縮するかの二択である。

  • 捨てる
    • 明らかに捨ててよいものは、そもそも保持していない。
    • 何らかの処理成果物(トランザクションやOutputデータ)は、Inputデータと処理プログラムとそのパラメータが有れば再処理すれば得られるが、再計算コスト(時間)を考慮すると捨てたくない。
  • 圧縮する
    • 劣化を伴う非可逆圧縮の圧縮率を高めるのは前提として却下。
    • ファイルシステムの圧縮機能は過去の経験から使いたくない(NTFSの圧縮機能で巨大ファイルの書き込み時に長時間CPUを占有し、見かけ上サーバーが応答しなくなり業務開始に間に合わなかったことがある)。
    • JPEGやH264など既に圧縮済ファイルは可逆圧縮ツールで圧縮しても、ほぼ削減されない(せいぜい数%)ため、圧縮・展開にかけるコスト(時間)に見合わない。
    • 非圧縮TIFFはLZWやZIPで可逆圧縮できる。しかもTIFFファイルフォーマットのままで(再処理が必要になった際に、手作業で事前にツールで展開作業することやプログラム修正が不要)。⇒採用

TIFFファイルは一般に巨大である。圧縮済でもかなりデカイ。なので、保持しているTIFFファイルが圧縮済か否かファイルサイズから見当をつけるのは少し難しい。まずは、圧縮するべきTIFFファイルであるかを判別するために、対象ファイルが圧縮済かを識別する必要がある。
※ここから先のコマンドの実行にはImageMagickが導入されている必要がある。また、Windows系プラットフォームを前提とする。

TIFFファイルの圧縮状況の確認

identify -verbose TARGET.TIF | findstr Compression

ここでLZWやZIPと表示されればそれらの方法で圧縮済であることが判る。

TIFFファイルの圧縮

LZWで圧縮(元ファイルを上書き)

convert TARGET.TIF -compress lzw TARGET.TIF

ZIPで圧縮(元ファイルを上書き)

convert TARGET.TIF -compress zip TARGET.TIF

上書きしたくなければ出力ファイル名(末尾のTARGET.TIF)を入力ファイル名(convertの次のTARGET.TIF)と別名にする。

圧縮アルゴリズムの選択

複数ファイルで試したところ、以下の傾向がある模様。

  • LZW
    • 圧縮が早い
    • 圧縮率が低い
  • ZIP
    • 圧縮が(かなり)遅い
    • 圧縮率が高い

なお、ZIP圧縮はTIFFファイルとしては比較的新しく追加された圧縮方法で、古いアプリケーションでは読めない可能性があるため、互換性に留意が必要。
そういった観点を含めてアルゴリズムを選択する必要があるが、私の場合はZIP圧縮TIFFファイルが後続処理で用いるアプリケーションで正しく読めることを確認したうえ、所要時間よりもストレージ節約を優先しZIP圧縮を選択した。

その他雑記

  • 元画像にもよるが、ZIPによる圧縮率は概ね70%前後(約3割程度の削減)。⇒数百MBの空き容量だったHDDに500GB程の空きが生まれた!
  • 圧縮処理にはシングルスレッドしか使わないっぽい。⇒2core/4thread機なら4パラで実行することで、所要時間を4分の1程度に大幅に削減可能。
  • それでも遅い。3TBのHDDに格納された数千(数万かも)枚の高解像度TIFFファイルの圧縮に、一晩とかその程度ではなく、数日かかる(第二世代Core i3搭載機での実績値)。
  • LZWで圧縮済みのTIFFファイルを改めてLZWで圧縮してもファイルサイズが削減されることがある。即ち、書き出したソフトウェアの差異によって同じLZWでも圧縮率が違う模様。LZWのアルゴリズムから察するに辞書サイズが違うとかだろうか。
  • 通常業務で使うハイスペックなマシンを圧縮のために投入する必要はない。もちろん、ハイスペックなマシンが余剰なら圧縮処理に投入すればいいが、時間はかかっても(どうせほとんど使われない)旧式のマシンに任せておけばシステムリソースの有効活用になる。
  • 短期的にはストレージ容量が幾分確保できるが、それもで時間の問題で食い潰されることは明確なので中期的にはHDDの追加投入が必要。
  • HDDそのものの費用だけでなく、維持管理の事も考慮すると長期的にはAmazon Glacier辺りのクラウドアーカイブを利用することの検討も必要。
  • 暖房をつけるほどではないが、ちょっと冷えるようになってきた昨今の気温はバッチ処理で暖をとるのに最適。