他の回答者の洞察に感謝します。
Web に関する他の質問から、NTFS はサイズを処理できるように思えますが、Windows エクスプローラーとネットワーク操作は、はるかに低いしきい値で停止する可能性があります。SHA-1 が 1,000,000 個の「ファイル」のランダムなセットに対して生成するものと同様の非常に均一なランダム分布のシミュレーションを実行しました。
Windows エクスプローラーは、ディレクトリ幅 4 がそのレベルの最大値 (65536) にすぐに近づくため、間違いなく好みませんでした。上位 2 つのディレクトリの長さをそれぞれ 3 (最大 4096) になるように調整し、残りの 34 桁を第 3 レベルに配置して、深さとレベルごとのディレクトリ数が多すぎる確率のバランスをとろうとしました。これにより、Windows エクスプローラーで構造の参照を処理できるようになります。
これが私のシミュレーションです:
const string Root = @"C:\_Sha1Buckets";
using (TextWriter writer = File.CreateText(@"C:\_Sha1Buckets.txt"))
{
// simulate a very even distribution like SHA-1 would produce
RandomNumberGenerator rand = RandomNumberGenerator.Create();
byte[] sha1 = new byte[20];
Stopwatch watch = Stopwatch.StartNew();
for (int i=0; i<1000000; i++)
{
// populate bytes with a fake SHA-1
rand.GetBytes(sha1);
// format bytes into hex string
string hash = FormatBytes(sha1);
// C:\_Sha1Buckets
StringBuilder builder = new StringBuilder(Root, 60);
// \012\345\6789abcdef0123456789abcdef01234567\
builder.Append(Path.DirectorySeparatorChar);
builder.Append(hash, 0, 3);
builder.Append(Path.DirectorySeparatorChar);
builder.Append(hash, 3, 3);
builder.Append(Path.DirectorySeparatorChar);
builder.Append(hash, 6, 34);
builder.Append(Path.DirectorySeparatorChar);
Directory.CreateDirectory(builder.ToString());
if (i % 5000 == 0)
{
// write out timings every five thousand files to see if changes
writer.WriteLine("{0}: {1}", i, watch.Elapsed);
Console.WriteLine("{0}: {1}", i, watch.Elapsed);
watch.Reset();
watch.Start();
}
}
watch.Reset();
Console.WriteLine("Press any key to delete the directory structure...");
Console.ReadLine();
watch.Start();
Directory.Delete(Root, true);
writer.WriteLine("Delete took {0}", watch.Elapsed);
Console.WriteLine("Delete took {0}", watch.Elapsed);
}
約 50,000 を超えると、シミュレーションは少し遅くなるように見えますが (5000 あたり 15 ~ 20 秒)、その速度は維持されます。私のマシンでは、最後の削除に 30 分以上かかりました。
100 万ハッシュの場合、分布は次のようになります。
- 第 1 レベルには 4096 個のフォルダーがあります
- 第 2 レベルには平均 250 個のフォルダがあります
- 第 3 レベルには平均 1 つのフォルダがあります
これは、Windows エクスプローラー内で非常に扱いやすく、深すぎたり広すぎたりすることはないようです。分布がこれほど均等でない場合、明らかに問題が発生する可能性がありますが、それは第 3 レベルでのみです。最初の 2 つのレベルは 4096 に制限されています。ターゲット セットがもっと大きければ、さらにレベルを追加して多くの成長の可能性を得ることができると思います。私のアプリケーションでは、100 万が非常に合理的な上限です。
ディレクトリ構造のヒューリスティックを決定するためのそのようなテストの有効性について、誰か考えがありますか?