雑記

ファイル圧縮処理の高速化施策【7zip, DOSバッチ, 並行処理】

※ この記事にはアフィリエイトリンクが含まれています

結論: 7zip のオプション変更で2倍、start コマンドによる並列処理で5倍速になりました。数百GBのファイル圧縮を高速化した実際の手順を紹介します。

大量のファイル圧縮をするので高速化を検討して欲しいと指示を受けました。

解凍は 7zip のコマンドライン版を DOS バッチで使ってました。

7z.exe a hoge.zip fuga_dir

今回は fuga_dir に数百 GB 分のログを保存してたので3時間程度かかってたようです。

配布サイトの説明はこちら。

ここから2段階で高速化を試しました。

まずオプションを試して手元では 2倍 早くなった

7zip 高速化 で検索すると、海外の QA を自動で日本語化してるらしいサイトのある回答が目に止まりました。

7-Zipを高速化する方法
7-Zip 9.13ベータ版を入手した場合、アーカイブの種類をLZMA2に変更して、必要なだけスレッドを使用できますが、メモリ使用量は驚くほど増えます。 ベータ版をインストールし、アーカイブしたいものを右クリックして、7-Zipの接続メニューでをクリックすると、以下のウィンドウに似たものが表示されます。圧縮方法の下の左側に、「LZMA2」があります。これにより、スレッド数を変更できますが、これは少し下のオプションになります。 これにより、システムに合わせて調整できるため...

start “” /wait /belownormal c:Progra1-Zipz.exe a -tzip -mx=1 -mmt=off t:backup.zip d: olderToBackup*

この時点では start が何を指すのか分かりませんでしたが、調べてみると別のコマンドプロンプトで起動するやり方なんだなと学びました。(あとで使うことになる)

まずはオプションの「7z.exe a -tzip -mx=1 -mmt=off」を試してみることに。

powershell -command "Measure-Command { 7z.exe a -tzip -mx=1 -mmt=off hoge.zip fuga_dir }"

時間を計測するために powershell を使用しました。ついでにご紹介。

Windows(PowerShell)でコマンド・スクリプトの処理時間を計測する | ぴぐろぐ
Windows でコマンドやバッチ処理にかかる時間を調べたいときのやり方を紹介します。具体的には、Linux の time コマンドと同じようなことをWindowsでもPowerShellのコマンドを使って実施可能です。 もちろんコマンドプロンプトからのOK。ファイルを圧縮・解凍する時間を計測したり、ファイルをリストアップする時間を計測するなどで利用できますね。

これで手元のテスト環境では 3倍程度早くなりました。
報告して試してもらったところ、実環境では半分くらいかなとのこと。

start + goto で並列処理して5倍速

自分が担当した機能がトラブルなく暇だったので、さらに高速化できないか調べてみました。

上記方法では CPU 負荷が全体で 30% 程度だったので、25% くらいとして4多重にする方法を探しました。
フォルダをまるごと圧縮だと多重化できないので、フォルダ内のファイルを個別に圧縮する処理。
(それでも問題ないとのこと)

DOS では出来る気がしなかったので Powershell や ActivePerl での実現方法を調べたところ、簡単にはできなさそう。いろいろ考えてたどり着いたのは DOS バッチでした。

コマンドプロンプトで大量ファイルの処理を並列でやりたい - Qiita
野暮用で大量のSVGをinkscapeでEMFに変換しようとしたら、雑なループだと結構時間がかかりそうだったので並列して処理させたかった。ただ、メモリやプロセスを食いつぶして中途半端に止まるのは嫌なので上限数を決めたかった。sv...

完璧にやりたいことと同じです。素晴らしい!

set PARALLEL=10
::この辺りは自由に書く

を 4多重にして 7z.exe のコマンドに書き換えるだけでいけそう!

ってことで書き換えて試してみると…うまくいきました!!

CPU はほぼ 100% 張り付きますが、PC が全く使えないほどではありませんでした。
6多重ぐらいまではいけるかも知れません。

テスト環境での圧縮処理時間は、元の 5倍速 になって満足。

指示者に報告をしたところ「明日試してみます」ということでその日は終わりました。

ていうか start コマンドだけでいいじゃん?

翌日になって「オプションつけて start コマンドで起動すればいいんじゃね?」と思い至り提案したところ、それが採用されました。笑

DOS バッチが応答を待つ時間を短くしたかったので、start コマンドで別プロセスにしてしまえばよかったという話なんですよね。

まあ、めでたしめでたしでした。

まとめ

ファイル圧縮の高速化で試した施策をまとめます。

  • 7zip オプション変更-tzip -mx=1 -mmt=off): 圧縮率を下げて速度優先 → 約2倍速
  • DOSバッチで並列処理(start + goto ループ): CPU を使い切る → 約5倍速
  • 最終的には start コマンドだけで十分だった: シンプルが最強

数百GBレベルの圧縮でも、ちょっとした工夫で大幅に時間短縮できます。同じような状況で困っている方の参考になれば。

こういった業務の自動化・高速化、今なら生成AIに相談するのも手です

「7zipの圧縮を速くしたい」「DOSバッチで並列処理したい」といった相談を ChatGPT や Claude にすると、すぐにスクリプトのひな形を出してくれます。私がこの記事を書いた当時は丸一日かけて調べましたが、今なら数分で解決できるでしょう。

ABOUT ME
rabirgo
うさぎ年(rabbit)おとめ座(virgo)生まれの rabirgo です。 2019年よりフリーランスとして活動しています。 よかったら Twitter フォローお願いします! Follow @rabirgo

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です