スキップしてメイン コンテンツに移動

8億1140万個の0バイトファイルでHDDをまるごと埋め尽くす

古くて遅いHDDが出てきたので、これの中に0バイトファイルを可能な限りたくさん作りたいなーと思った。



ファイルをコピーしまくる

まずHDDをフォーマットしてまっさらにする。

NTFSでフォーマット、アロケーションユニットサイズは最小の512B。


そしたら0バイトファイルを1個つくる。

それをコピーして2個にする。

できた2個を選んでまたコピーして、4個にする。

その4個をコピーして8個にする。また16個にする。32個にする。

……。

16384個にする。


フォルダに入れてもっとコピーしまくる

今度は16384個の0バイトファイルたちを1つのフォルダに入れて、入ったフォルダごと増やしていく。

とりあえず16個に増殖させる。

この16個を1つのフォルダに入れて、さらに4個に増やす。

この4個を1つのフォルダに入れて、さらに4個に増やす。


 A, B, C, D
 └─ a, b, c, d
   └─ 00, 01, 02, ..., 15
     └─ 00000-16383

この時点で↑のような感じ。

Aフォルダ1つの中に104万個のファイルがあって、AからBをコピーで作るだけで20分くらいかかる。


もっとコピーしまくる

コピーは続くよどこまでも。

さっきの4つをまた1つのフォルダにまとめて、さらに4倍にする。

それをもう1度1つにまとめて、さらに4倍にする。

このあたりで「コピーとかじゃなく、スクリプト使って無限ループでファイル生成するのが早かったのでは?」と気づいたが、考えないことにして先に進む。


エクスプローラは役立たず

大量ファイルをコピーするときのTipsを教えましょう。

エクスプローラを使うと、コピー準備の「計算中」みたいな表示のまま止まって、開始まで延々待たされます。これは、よくない。

そういう時はDOS窓を開いて xcopy /e W\ X\ みたいにやるとよいです。これなら瞬時にコピー開始してくれるからね。

しかも複数窓開けば並列コピーできるんだな。2窓なら合計1.4倍速くらいかな? 多少速い。


XからYを作るxcopy中


ここまできた↓

 W, X, Y, Z
 └─ w, x, y, z
   └─ A, B, C, D
     └─ a, b, c, d
       └─ 00, 01, 02, ..., 15
         └─ 00000-16383

Wフォルダには2^24個の0バイトファイルが入っている。大体1700万個くらい。

1つ1つの中身は0バイトなんだけど、この個数になると管理用の容量消費がバカにならない。

実際WをコピーしてXを作ったところ、HDD全体の空き容量が20GiBくらい減っていた。こんなに役に立たない20GiBもなかなかないなあ。うれしい。ちなみにフォルダのプロパティでは相変わらず0バイトと出る。


俺がちりつもだ!

W, X, Y, Z の4つをまたひとまとめにして、4倍に増やす。

それをさらに1つにして、また4倍に増やす。

「塵も積もれば山となる」と、言葉ではよく聞くけれど、実際に塵を1つ1つ積もらせて山を作る経験をみんなはしてるかな? 私はしていますよ。


コピー1発・17時間・6700万ファイル!


ついに新規ファイル作成が不可能に

最終完成形。

  Ω
 └─ Υ, φ, χ, Ψ
   └─ α, β, γ, δ
     └─ W, X, Y, Z
       └─ w, x, y, z
         └─ A, B, C, D
           └─ a, b, c, d
             └─ 00, 01, 02, ..., 15
               └─ 00000-16383

Υフォルダ1つだけで2^28個のファイルがあって、空き領域を308GiB消費する。

Ω全体では最大2^30個(10億7000万)のファイルを持てるのだが、その手前の8億ちょいでHDDが容量不足になった。


0バイトファイルだけでもHDDは埋められる


正確なファイル数を数えてみる

  • Υ、Φ、χはそれぞれ満タンあって、3 * 2^28個。
  • Ψは、Ψ\α\W\w\ までが満タンで、2^22個。
  • 次の x\ が途中終了していて、1923408個。

というわけで、NTFS 1TiBのHDDを埋めるまでに作れたファイル総数は

811,424,080個

でした!

カウントだけで何十時間かかったかわからない
「0バイト、8億ファイル、16万フォルダ」


もちろんドライブの容量はちゃんと使い切っております。

全部埋まった記念写真。ピースピース。


ここまで達成できて感無量。コピーだけで2週間くらいかかった気がするな。

スクショだと残容量200KiBくらいあるように見えるんだけど、実際にはこれ以上1ファイルたりとも作成できない。

「0バイトの空き領域が不足している」という様子のおかしなメッセージが見れてうれしい。0除算みがあるよね。


ちなみに、計算するとファイル1個あたり1.2KiBくらい消費してたことになるんだけど、NTFSではファイル1個あたりが使うMFT容量は1.0KiBらしい。

一緒に作られてたフォルダの分とか、MFTファイル自体の断片化とかで、2割余分に消費したってことなのかな。


全ファイル削除しても容量が回復しない

フォーマットすれば元通りになるのだが、それはせず愚直に全部削除する。

するとファイルが0個なのに容量は減ったままという不思議状態ができあがる。


スクショのとおりで、ドライブ直下にファイルは1つもない。なのに8割以上の容量が消費されてる。

fsutilしてみると、消費されている774GiBは全部MFTの分だとわかる。なるほどな。

C:\>fsutil fsinfo ntfsinfo D:
NTFS ボリューム シリアル番号 :        0x01dcab99bfc72e40
NTFS バージョン      :                3.1
LFS バージョン       :                1.1
総セクター数s     :                1,953,521,663  (931.5 GB)
総クラスター数    :                1,953,521,663  (931.5 GB)
空きクラスター数s     :                  329,674,732  (157.2 GB)
予約済み総クラスター数 :                  8,192  (  4.0 MB)
記憶域予約用に予約済み :                 0  (  0.0 KB)
セクターあたりのバイト数  :                512
物理セクターあたりのバイト数 :        4096
クラスターあたりのバイト数 :                512  (0 KB)
FileRecord セグメントあたりのバイト数    :  1024
FileRecord セグメントあたりのクラスター数 :  2
MFT の有効なデータ長 :            773.89 GB
MFT 開始 LCN  :                   0x0000000000075eef
MFT2 開始 LCN :                   0x000000000000001f
MFT ゾーン開始 :                   0x00000000747031c0
MFT ゾーン終了   :                   0x0000000074703920
MFT ゾーン サイズ  :                   944.00 KB
デバイスの最大トリム エクステント数 :     0
デバイスの最大トリム バイト数 :       0
ボリュームの最大トリム エクステント数 :     62
ボリュームの最大トリム バイト数 :       0x40000000
リソース マネージャー識別子:      CADCF762-1784-11F1-B7E5-D4548B25DAB3


廃棄予定の古ノートPCから内蔵2.5インチSATA HDDを取り出してできる最高の遊び。

大変たのしいインクリメンタルゲームでした。まんぞく。


関連記事


コメント