Oct 172010
 

NTFSファイルシステムで1フォルダに大量のファイルを書き込む場合、8.3形式ファイル名の生成がボトルネックになると聞いたので実験。

こちらの情報によると「300,000ファイル以上」との記述があるので、1フォルダに500,000ファイルを作成する場合の処理時間をWindows XPで測定してみる。8.3形式ファイル名の有効化、無効化には、fsutils behaviorコマンドを使う。

測定結果はこちら。

ファイル数 処理時間(秒)
disable8dot3 = 0 disable8dot3 = 1
10000 7 5
20000 15 10
30000 49 16
40000 82 21
50000 286 26
60000 766 31
70000 1590 35
80000 2716 40
90000 4090 45
100000 5792 50
110000 6192 54
120000 6596 59
130000 8475 64
140000 10604 69
150000 13985 74
160000 18066 78
170000 22742 83
180000 27976 88
190000 33826 92
200000 97
210000 103
220000 108
230000 113
240000 118
250000 122
260000 128
270000 132
280000 138
290000 142
300000 146
310000 151
320000 156
330000 161
340000 166
350000 170
360000 176
370000 180
380000 186
390000 193
400000 198
410000 204
420000 208
430000 213
440000 218
450000 223
460000 229
470000 233
480000 238
490000 243
500000 248

8.3形式ファイル名が有効な状態では、190,000ファイル作成までにトータルで9時間以上を要する(途中で測定中止)。最初の10,000ファイルは7秒なのに、ファイル数が増えるに従い処理時間が増えて、180,000からの10,000ファイルでは97分という状態になる。
しかし8.3形式ファイル名を無効にした状態では、コンスタントに5秒前後で10,000ファイルを書き出すことができるようになった。

測定に使用したスクリプトはこちら。”TXT” + 6桁の数値 + “.txt”という形式でひたすらファイルを作成していく。

Option Explicit

Dim fileObj
Dim outFile
Dim outCount, maxCount, repCount
Dim startedTime, elapsedTime
Dim fileName

maxCount = 500000
repCount = 10000

Set fileObj = CreateObject("Scripting.FileSystemObject")

startedTime = Now()

For outCount = 1 To maxCount Step 1
	fileName = "TXT" & Right("000000" & outCount,6) & ".txt"
	Set outFile = fileObj.CreateTextFile(fileName)
	outFile.Close()
	If (outCount Mod repCount) = 0 Then
		elapsedTime = DateDiff("s",startedTime,Now())
		WScript.Echo outCount & "," &elapsedTime
	End If
	Set outFile = Nothing
Next

Set fileObj = Nothing

Sorry, the comment form is closed at this time.