雑記

ファイル圧縮処理の高速化施策【7zip, DOSバッチ, 並行処理】[ほぼ日刊らびるご vol.621]

@rabirgoです。

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

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

7z.exe a hoge.zip fuga_dir

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

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

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

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

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

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

start “” /wait /belownormal c:Progra1\7-Zip\7z.exe a -tzip -mx=1 -mmt=off t:\backup.zip d:\folderToBackup\*

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

さいごに

暇だったといえいろいろ調べたのは何だったんだ!笑
と思ったのでここに書き残しておきます。

それにしても DOS バッチは癖があって UNIX でシェルスクリプトを書き慣れてる私にはなかなか受入が難しいです。

Windows で bash が使えるようになったとは言ってもまだ何となく怖いので、実践で使えるのはもう少し先になりそうですね。

今日の世界一周絶景日めくりカレンダー

日めくりカレンダーを紹介しています。

気分を変えるために日めくりカレンダーを買った[ほぼ日刊らびるご vol.498]@rabirgoです。 先日どうも調子悪いって日がありました。 https://rabirgo.net/daily-rabi...

桂林

中華料理屋さんでよく聞く気がする桂林。

日本人には水墨画のような、という表現で伝わるくらい見慣れてる気がしますね。
もやがかかった断崖が想起させるんでしょうかね。

中国南部・広西チワン族自治区にある、水墨画のような風景が美しい「桂林(けいりん)」に行って来ました。石灰岩の浸食によって出来たカルスト地形が特徴的で、柱のような岩の数々を見ることが出来、2014年には世界遺産にも登録されています。その他...

関連記事

前日の記事はこちら

日曜の作り置き(4週目)[ほぼ日刊らびるご vol.620]@rabirgoです。 まだまだ、料理の作り置き 続いてます。前週はこちら。 https://rabirgo.net/daily-r...

翌日の記事はこちら

パター練習するアレを買ってしまった[ほぼ日刊らびるご vol.622]@rabirgoです。 まさか自分がこれを買う日が来るとは。 すっかりゴルフ部屋が出来上がってしまいました。 パター練...
ABOUT ME
rabirgo
うさぎ年(rabbit)おとめ座(virgo)生まれの rabirgo です。 2019年よりフリーランスとして活動しています。 よかったら Twitter フォローお願いします! Follow @rabirgo

COMMENT

メールアドレスが公開されることはありません。