77

2MB から 5GB の間のいくつかのファイルをディスクに書き込んでいるとします。FileStream の適切なバッファ値は何ですか?

数メガバイトのバッファサイズで作業するのは賢明ですか、それともキロバイトバッファに固執する必要がありますか?

4

3 に答える 3

45

デフォルトのバッファ サイズは 4 KiB です。

また、こちらもご覧ください: Sequential File Programming Patterns and Performance with .NET

.NET Framework でのシーケンシャル ファイル アクセスのプログラミング パターンについて説明し、パフォーマンスを測定します。デフォルトの動作では、1 つのディスクで優れたパフォーマンスが提供されます。読み取りと書き込みの両方で 50 MBps です。大きなリクエスト サイズを使用し、可能であればファイルの事前割り当てを行うことには、定量化可能な利点があります。ディスク アレイを考慮すると、.NET アンバッファード IO は 16 ディスク アレイで 800 MBps を提供しますが、バッファード IO はそのパフォーマンスの約 12% を提供します。その結果、ハイパフォーマンスのファイルおよびデータベース ユーティリティは、シーケンシャル パフォーマンスを最大化するために、依然としてバッファリングされていない IO を使用することを余儀なくされています。レポートには、これらの測定値を取得するために使用された概念とコードを示すダウンロード可能なソース コードが付属しています。

于 2009-12-07T21:26:16.300 に答える
38

参照されているドキュメントに基づく簡単なベンチマークでは、私のシステムでは 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();
        }
于 2009-12-07T22:29:03.723 に答える