バッチファイル(ファイル操作_5_ファイルサイズ確認3)

■大量のファイルへの対応を考える。
前回のバッチを使って、Cドライブ配下に対してファイルサイズを確認すると、いつまでたっても終わらない。あと、実際に動いているか分からない。サンプルフォルダではせいぜい十数ファイル程度しか扱っていなかったので、ファイルの数を増やしたサンプルで試してみる。

サンプルフォルダ、ファイルを作るコードは下のもの。それぞれのフォルダに100ファイルずつ入れて、計300ファイルとしている。

echo off

set n=300
set filenum=100
set filenum2=200

mkdir .\Folder4\Subfolder4-1\
mkdir .\Folder4\Subfolder4-1\Subsubfolder4-1-1\
mkdir .\Folder4\Subfolder4-2\

setlocal enabledelayedexpansion 
for /l %%m in (1,1,%n%) do (
    set char=aaaab!char!

    if  %filenum% geq %%m (
    echo !char! > ".\Folder4\Subfolder4-1\AAA_sampletext%%m.txt"
    ) else if %filenum2% geq %%m (
    echo !char! > ".\Folder4\Subfolder4-1\Subsubfolder4-1-1\BBB_sampletext%%m.txt"
    ) else (
    echo !char! > ".\Folder4\Subfolder4-2\CCC_sampletext%%m.txt"
)
)

前回のバッチの始めと終わりにecho %time%を追加して、始めるときの現在時刻、終わりの現在時刻を取得し実行にどのくらい時間がかかっているか確認する。

3回動かしてみると、24.6秒、20.7秒、22.2秒と約20秒ちょっとかかった。また、ファイルをそれぞれ1000ずつにしてみると、6分29.3秒、 6分36秒、5分52秒となった。逆にそれぞれ10ずつにしてみると、1.9秒、1.8秒、1.6秒となった。

まとめると次の表になる。

ファイル数1回目 (秒)2回目 (秒) 3回目 (秒)
30(10ずつ)1.91.81.6
300(100ずつ)24.620.722.2
3000(1000ずつ) 389.3396352

Cドライブ配下のファイル数をプロパティなどから確認すると、システムに必要なものも含めて60万ファイルほどある。システム内のファイルに対して、直接ファイル削除をすることはあまりないと思うので、ユーザのフォルダ内に限定する。それでも15万ファイルほどあった。
かかる時間の増え方を基に、単純にファイル数を10万のオーダーにしてみると数十時間くらいかかりそう。

前回のバッチは、dir /s /b /a-d でファイルのフルパスを取得した後、1行ずつdir [ファイルのフルパス]でファイルサイズを得ている。ただ、よく調べてみると、dir /s /a-d を実施すると下のような表示になりファイルサイズも得られる。そのため、1行ずつdirを実行する必要はなさそう。

次回、省略したコードを使って同様に時間を測ってみる。