・大量のダウンロードファイルを効率的にデコードする方法を考えてみた。その1 par2編2009/07/30 15:49

毎日大量のファイルをネットニュースからダウンロードしている酢こんぶにとって、そのファイルをデコードする手間は馬鹿にならない。というか、ダウンロード自体は自動で行われるので、手間がかかるのは主にファイルのデコードと整理ということになる。
内容を確認しつつ新しいフォルダを作るという作業が必要なファイルの整理に関しては自動で行えるわけもないので、デコードに関して何とか効率を上げることはできないかと考えた。
酢こんぶがダウンロードするファイルは数百MBから数GB程度のサイズのものが数十個に分割されているのが普通で、何らかの方法で「結合->デコード」の作業が必要となる。とりあえず、どんなファイルをデコードする必要があって、このときどのような問題点があるのかを整理してみよう。

(1)par2ファイルを使って「結合->デコード」ができるもの。

par2ファイルというのは本来は壊れたファイルを修復するためのものなのだが、これを使って簡単にデコードできるようにしたファイルの投稿が増えてきた。具体的には、
movie.avi.000
movie.avi.001
movie.avi.002
 |
というように分割されたファイルの他にpar2という拡張子のファイルが投稿され、これをQuickParというアプリで実行すると分割ファイルの内容をチェックした後に結合、結合後のファイルの検査という作業を連続的に行ってくれるので手間はかからない。(時間はかかるが)

(2)拡張子rarで、WinRARを使って「結合->デコード」できるもの。

movie.avi.part01.rar
movie.avi.part02.rar
movie.avi.part03.rar
 |
というように分割されたファイルで、WinRARがインストールされていれば、コンテキストメニューから「ここに解凍」で分割ファイルと同じ場所にデコードしてくれるので、あまり手間はかからない。

(3)単純にバイナリ分割されていて、バイナリ結合さえすればよいもの。

movie.avi.000
movie.avi.001
movie.avi.002
 |
というように元のファイルを単純にバイナリ分割したファイルで、結合のためのユーティリティを使えば簡単に結合できる。


てなわけで、デコードするファイルがひとつしかないなら特に問題があるわけではないが、対象が数十個となると話はまったく違ってくる。

例えばpar2でデコードするファイルが10個あるとしよう。まず一つ目のファイルのpar2ファイルをダブルクリックして実行を開始する。続いて二つ目の実行を開始する、、、というようにして10個目まで同時実行すると何が起きるかというと、10個のファイルを同時にデコードしているのでCPUの負担が非常に大きくなる。さらにHDDへの同時アクセスも発生するのでCPU負荷ともあいまってPCの動作が非常に緩慢になり、PCで作業をすることは困難となる。つまりデコードが終わるまでPCを使う以外のことで時間をつぶさなければならない。またHDDへの同時アクセスによってデータの読み書きの効率は非常に悪くなり、10個をシリアルにデコードした場合と比べて数倍の時間がかかることになるし、HDDにとっては耐久試験さながらの過酷な使用状態となる。

じゃあひとつずつデコードすればいいのかというと、その場合ずっとPCにはりついていなければならず、PC作業以外のことができなくなってしまうので、結局4個くらいを同時にデコードすることでHDDへの負担を軽くしつつ、撮りためたTV番組を消化などして時間をつぶし、デコードが終わったころを見計らってPCに戻って次の4個のデコードを開始するというような運用になる。(実話)

こんな感じでやってきたのだが、どうにも手間がかかるのでなんとかシリアルに実行できないだろうかと考えた。

まず思いついたのはバッチファイルを使う方法だ。これを使えばファイルを連続的に実行することができるはず。具体的な使い方は、

"d:\movie\movie.avi.par2"
"d:\douga\douga.avi.par2"

てなファイルのパスを書いたテキストファイルを用意、拡張子をbatにして保存、ダブルクリックで起動すればOK。

しかしQuickParを実行する場合は問題があった。それはQuickParが自動的に終了してくれないことだ。
QiuckParはファイルのデコードが完了してもWindowを表示したままで自動的に終了することはない。バッチファイルで連続実行した場合、バッチで実行したアプリが終了しない限り次へは進まないので処理が止まってしまう。つまり連続実行はできない。

つぎに考えたのはVB Scriptを使う方法。これは進化したバッチファイルのようなもので、doやwhile等の制御構造を使えるのが便利だが、今回のポイントは立ち上げたアプリが終了しなくても次の実行に移ってくれる点。具体的な使い方は、

Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.Run ("""d:\movie\movie.avi.par2""")
WScript.sleep(1000*60*20)
WSHShell.Run ("""d:\douga\douga.avi.par2""")
WScript.Quit

てな感じのテキストファイルを用意、拡張子をvbsにして保存、ダブルクリックで起動すればOK。
ちなみに、WScript.sleep(1000*60*20)というのは「20分待て」という指示で、これがないとどんどんデコードが始まってしまうので前のデコードが終わる時間を20分くらいと見積もって設定してある。
この方法でかなり楽になったのだが、不満がないわけではない。
まず適当な時間待ちをしているけど、前のデコードがはやく終わってしまうと無駄な時間が増えるし、かといって待ち時間を短くすると前のデコードが終わらないうちに次が始まってしまう可能性が高くなって、結局パラレルデコードになってしまいかねない。
またQuickParのWindowは閉じないのでどんどんWindowが増えて、あまり気持ちがよくない。(実害はないが)

ま、とりあえずpar2に関しては置いといて、その2ではrarファイルのデコードについて考えてみる。

(つづく)

------------------------------------------
このブログの本店「木全屋かるた堂」もよろしくです。

・ファーストガンダムのかるた売ってます。
・ファイル整理に便利な自作ツール置いてます。
・写真(コスプレ、ポートレート、動物)公開してます。
------------------------------------------

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
このブログはxxの思考錯誤日記です。
xxの部分をお答えください。

コメント:

トラックバック

このエントリのトラックバックURL: http://karutadou.asablo.jp/blog/2009/07/30/4465060/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。