@rabirgoです。
大量のファイル圧縮をするので高速化を検討して欲しいと指示を受けました。
解凍は 7zip のコマンドライン版を DOS バッチで使ってました。
7z.exe a hoge.zip fuga_dir
今回は fuga_dir に数百 GB 分のログを保存してたので3時間程度かかってたようです。
配布サイトの説明はこちら。
ここから2段階で高速化を試しました。
まずオプションを試して手元では 2倍 早くなった
7zip 高速化 で検索すると、海外の QA を自動で日本語化してるらしいサイトのある回答が目に止まりました。
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 を使用しました。ついでにご紹介。
これで手元のテスト環境では 3倍程度早くなりました。
報告して試してもらったところ、実環境では半分くらいかなとのこと。
start + goto で並列処理して5倍速
自分が担当した機能がトラブルなく暇だったので、さらに高速化できないか調べてみました。
上記方法では CPU 負荷が全体で 30% 程度だったので、25% くらいとして4多重にする方法を探しました。
フォルダをまるごと圧縮だと多重化できないので、フォルダ内のファイルを個別に圧縮する処理。
(それでも問題ないとのこと)
DOS では出来る気がしなかったので Powershell や ActivePerl での実現方法を調べたところ、簡単にはできなさそう。いろいろ考えてたどり着いたのは DOS バッチでした。
完璧にやりたいことと同じです。素晴らしい!
set PARALLEL=10
::この辺りは自由に書く
を 4多重にして 7z.exe のコマンドに書き換えるだけでいけそう!
ってことで書き換えて試してみると…うまくいきました!!
CPU はほぼ 100% 張り付きますが、PC が全く使えないほどではありませんでした。
6多重ぐらいまではいけるかも知れません。
テスト環境での圧縮処理時間は、元の 5倍速 になって満足。
指示者に報告をしたところ「明日試してみます」ということでその日は終わりました。
ていうか start コマンドだけでいいじゃん?
翌日になって「オプションつけて start コマンドで起動すればいいんじゃね?」と思い至り提案したところ、それが採用されました。笑
DOS バッチが応答を待つ時間を短くしたかったので、start コマンドで別プロセスにしてしまえばよかったという話なんですよね。
まあ、めでたしめでたしでした。
さいごに
暇だったといえいろいろ調べたのは何だったんだ!笑
と思ったのでここに書き残しておきます。
それにしても DOS バッチは癖があって UNIX でシェルスクリプトを書き慣れてる私にはなかなか受入が難しいです。
Windows で bash が使えるようになったとは言ってもまだ何となく怖いので、実践で使えるのはもう少し先になりそうですね。
今日の世界一周絶景日めくりカレンダー
日めくりカレンダーを紹介しています。

桂林

中華料理屋さんでよく聞く気がする桂林。
日本人には水墨画のような、という表現で伝わるくらい見慣れてる気がしますね。
もやがかかった断崖が想起させるんでしょうかね。
関連記事
前日の記事はこちら

翌日の記事はこちら
