今日、仕事で150,000個のファイルを作って別のパソコンにコピーしようとしたところ、コピーする直前でエクスプローラーごとパソコンが固まってしまいました。メモリを8G積んでいるのですが、さすがにファイル150,000個は多かったみたいです...。
150,000というファイルの数は、何気なくコピーするには無理があるボリュームなのはわかりましたが、じゃあ諦めるかと言うとなかなかそうはいきません。とりあえず何とかしようということで、いろいろと試してみました。
同時に起動しているアプリケーションを全部終わらせる
私は一度起動したアプリケーションは再起動するまで起動したままにします。
これはいちいち終わらせるのがめんどくさいのと、あとは一度終了してしまうと何をしてたのか忘れてしまうことが多いのでとりあえず仕掛のものは全部起動したままにするという悪癖によるものです。
そんなわけでFireFoxやThunderbirdといった日常的に使うアプリケーションをはじめ、WordやExcel、VisioやVisioVisual Studioなどの開発に必要なアプリケーションやDropBoxなどの常駐アプリケーションなどたくさん立ち上がっていたのでこれを全部止めてから再度ファイルのコピーにチャレンジしました。
結果は変わらず、コピー前の処理で固まってしまいました。
がんばって全部落としたのに...。
ウィルス対策ソフトウェアを止める
ファイルI/Oを邪魔する代表格としてはウィルス対策ソフトウェが思い浮かびます。
うちの会社ではForefrontというマイクロソフト社製のウィルス対策ソフトウェアを使っていますが、こいつがなかなかの曲者でして、あらゆるI/Oを根こそぎ邪魔をしています。というか、そういうソフトウェアなのでしょうがないんですけど。
とりあえずこれを止めてファイルコピーをしてみました。
C:\> taskkill /F /IM:MsMpEng.exe
ちなみにForefrontはプロセスを止められても3回生き返るので、時間をおいて3回殺す必要があります。
3回生き返るってゾンビか...。
で、この対応の結果を申し上げると結局固まることに変わりなく効果は分からずでした。
対応前と同じく、ファイルのコピー前に固まるのでおそらく効果は無しかな...。
コマンドを使ってコピーする
ここまでやると「もしかしてエクスプローラーが悪いんじゃね?」ということに気付き始めたわたし。
悪いというか、ファイルの一覧を作ったりコピーする前にファイルをカウントしたりしているところで躓いているような気がしてきました。
そんなわけでファイルのコピーをDOSコマンドにやらせてみました(再利用するためにここではバッチファイルにしました)。
C:\> type filecopy.cmd :: 一旦ネットワークドライブを削除 net use /D Y: :: ファイルのコピー先にネットワークドライブを割り当てる net use Y: \\xxxxx\temp :: ファイルをコピー COPY D:\SOURCE\*.* Y:\ /Y :: ネットワークドライブを削除 net use /D Y:
すると固まることなく、すぐにファイルのコピーが始まりました。
こういう大量にリソースを使う処理をGUIでやらせちゃダメなのって当たり前だよな...とへこみつつ、とりあえず何とかなりそうなことに安心しました。
ただ、たしかにすぐコピーは始まったもののなんか転送速度が遅いんですよね。
100MBのネットワークで、しかもスイッチをひとつしかまたいでいないのに100kbpsくらいしか出ないんですよ...。小さいファイルをたくさんコピーしているのでしょうがないのかなと思いつつ、かなり不満はたまりました。
標準出力を止める
どこかに無駄は無いのかなと考えたところ、DOS画面に出ている処理状況の表示が無駄なことに気付きました。
デバッグするときならまだしも、速度にこだわってファイルのコピーしようというのであれば画面表示のようなリソースを使う処理は敵です。というわけで先ほどのバッチファイルを以下のとおり直しました。
C:\> type filecopy.cmd :: 一旦ネットワークドライブを削除 net use /D Y: :: ファイルのコピー先にネットワークドライブを割り当てる net use Y: \\xxxxx\temp :: ファイルをコピー COPY D:\SOURCE\*.* Y:\ /Y > NUL :: ネットワークドライブを削除 net use /D Y:
大変分かりにくいですが、違いはファイルコピーのところで出力結果をNULにリダイレクトしているところです。
こうすることでコピー中のファイル名は一切表示されなくなります。
これを試したら300kbpsまで早くなりましたので、とりあえずこれで勘弁してやることにしました。
気付いたこと
最初は「こういうちまちました作業はめんどくさくてやりたくないなー」と思いながらやっていたのですが、気づいたらすごく楽しんでやっていました。そして「状況から原因を推測して改善案を探る」とか「問題を見つけて取り除いてベストパフォーマンスを出せるようにサポートする」のって、実はとても自分の性分にあっていることに気付いたのでした。
今まではこういう地道な作業って苦手だと思っていましたが、案外こういう裏方作業も好きなんだなと気付いたわけです。そう考えると、自分が何に向いているのか?とか自分が本当にやりたいことって何なんだ?っていうのって意外に分からないもんなんだなと思っちゃいます。
今回の件については終わってみれば当たり前のことと言うか、「なんで最初からこれに気付かなかったんだ...」っていうことではあるのですが。