2011-07-05 7 views
5

.NETでファイルIOを実行すると、表示される例の95%が4096バイトのバッファを使用しているようです。バッファ長には4kbほど特別なものはありますか?それとも、forループのインデックスにiを使うような大会ですか?バッファ長には4kbほど特別なものはありますか?

+1

[最適なファイルバッファの読み取りサイズ?](http://stackoverflow.com/questions/1552107/optimum-file-buffer-read-size) –

答えて

7

これは、4Tが16TBまでのディスクのデフォルトのクラスタサイズであるためです。したがって、バッファサイズを選択するときは、クラスタサイズの倍数でバッファを割り当てることが理にかなっています。

クラスタはファイルの割り当ての最小単位です。したがって、ファイルに1バイトのみが含まれている場合は、4Kの物理ディスク領域が消費されます。そして、5Kのファイルは8Kの割り当てになります。


更新:コードサンプルを追加したドライブのクラスタサイズに

using System; 
using System.Runtime.InteropServices; 

class Program 
{ 
    [DllImport("kernel32", SetLastError=true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool GetDiskFreeSpace(
    string rootPathName, 
    out int sectorsPerCluster, 
    out int bytesPerSector, 
    out int numberOfFreeClusters, 
    out int totalNumberOfClusters); 

    static void Main(string[] args) 
    { 
    int sectorsPerCluster; 
    int bytesPerSector; 
    int numberOfFreeClusters; 
    int totalNumberOfClusters; 

    if (GetDiskFreeSpace("C:\\", 
      out sectorsPerCluster, 
      out bytesPerSector, 
      out numberOfFreeClusters, 
      out totalNumberOfClusters)) 
    {   
     Console.WriteLine("Cluster size = {0} bytes", 
     sectorsPerCluster * bytesPerSector); 
    } 
    else 
    { 
     Console.WriteLine("GetDiskFreeSpace Failed: {0:x}", 
     Marshal.GetLastWin32Error()); 
    } 

    Console.ReadKey(); 
    } 
} 
+0

ああ、私は参照してください。それはおそらくそれのようなものだったと思った。実行時にクラスターのサイズをディスクに合わせて決定する方法はありますか? – sheikhjabootie

+0

マネージコードを使ってクラスターサイズを取得する方法はわかりませんが、P/Invokeを使用してクラスターサイズを取得するために必要な情報を返すWin32 API関数 'GetDiskFreeSpace'を呼び出すことができます。必要な場合は、私が開発マシンにいるときに、少し後でサンプルを提供することができます。 –

+0

@ CodeHero、クラスタサイズを決定するためのクイックサンプルを追加しました。正に言えば、私はこれまでバッファサイズを最適化しようとはしませんでした。私はむしろ4Kや8Kのようなものにいくつかのパフォーマンステストを行い、必要なパフォーマンスをどのように与えるかを見て、それを実行します。メモリが制約されているデバイスで作業していて、4Kバッファを用意する余裕がない場合は、4Kを下回る時間しかありません。 –

0

を取得するために私の推測では、それは、.NET上でOSファイルのブロック・サイズ--- Windowsに関連していることだろう。

+0

2人の南アフリカ人が、SOの同じ質問に世界の反対側から答えていると想像してください。 –

+0

私は今このコメントを見ました:) ---はい、私たちはどこにでもいます! –

1

いくつかの要因:

  • 多くの場合、4Kは、ディスクドライブのクラスタサイズ
  • 4Kは、Windows上で最も一般的なページサイズですので、OSは4Kのメモリ・マップ・ファイルをすることができますチャンク
  • 4Kページは、コピーされずにドライブからOSにユーザープロセスに転送されることがよくあります。
  • Windowsは4Kバッファを使用してRAMにファイルをキャッシュします。

は、最も重要なのは長年にわたって多くの人々は、したがって、IOとOSのコードの多くは、4Kバッファ用に最適化され、上記のために自分のバッファ長として4Kを使用しています!

関連する問題