2MB から 5GB の間のいくつかのファイルをディスクに書き込んでいるとします。FileStream の適切なバッファ値は何ですか?
数メガバイトのバッファサイズで作業するのは賢明ですか、それともキロバイトバッファに固執する必要がありますか?
2MB から 5GB の間のいくつかのファイルをディスクに書き込んでいるとします。FileStream の適切なバッファ値は何ですか?
数メガバイトのバッファサイズで作業するのは賢明ですか、それともキロバイトバッファに固執する必要がありますか?
デフォルトのバッファ サイズは 4 KiB です。
また、こちらもご覧ください: Sequential File Programming Patterns and Performance with .NET
.NET Framework でのシーケンシャル ファイル アクセスのプログラミング パターンについて説明し、パフォーマンスを測定します。デフォルトの動作では、1 つのディスクで優れたパフォーマンスが提供されます。読み取りと書き込みの両方で 50 MBps です。大きなリクエスト サイズを使用し、可能であればファイルの事前割り当てを行うことには、定量化可能な利点があります。ディスク アレイを考慮すると、.NET アンバッファード IO は 16 ディスク アレイで 800 MBps を提供しますが、バッファード IO はそのパフォーマンスの約 12% を提供します。その結果、ハイパフォーマンスのファイルおよびデータベース ユーティリティは、シーケンシャル パフォーマンスを最大化するために、依然としてバッファリングされていない IO を使用することを余儀なくされています。レポートには、これらの測定値を取得するために使用された概念とコードを示すダウンロード可能なソース コードが付属しています。
参照されているドキュメントに基づく簡単なベンチマークでは、私のシステムでは 128KB のバッファ サイズを超えるとパフォーマンスが向上しないことが示されています。走行距離は異なる場合がありますので、お気軽に下記をご利用ください。
Stopwatch sw = new Stopwatch();
Random rand = new Random(); // seed a random number generator
int numberOfBytes = 2 << 22; //8,192KB File
byte nextByte;
for (int i = 1; i <= 28; i++) //Limited loop to 28 to prevent out of memory
{
sw.Start();
using (FileStream fs = new FileStream(
String.Format(@"C:\TEMP\TEST{0}.DAT", i), // name of file
FileMode.Create, // create or overwrite existing file
FileAccess.Write, // write-only access
FileShare.None, // no sharing
2 << i, // block transfer of i=18 -> size = 256 KB
FileOptions.None))
{
for (int j = 0; j < numberOfBytes; j++)
{
nextByte = (byte)(rand.Next() % 256); // generate a random byte
fs.WriteByte(nextByte); // write it
}
}
sw.Stop();
Console.WriteLine(String.Format("Buffer is 2 << {0} Elapsed: {1}", i, sw.Elapsed));
sw.Reset();
}