3

高度に圧縮されたデータを含む非常に大きなバイナリファイル(それぞれ> 1TB)があります。私はこれらのファイルから約300バイトのデータチャンクを頻繁に読み取ります。そのために、ファイルを一度に7つのスレッドで開き、読み取り操作を実行します。

ディスククラスタサイズはこれにどのように対応しますか。300バイトを読み取り、ディスククラスターサイズが64KBに設定されている場合、.netは300バイトではなく64KB全体を読み取りますか?

このシナリオには、小さいクラスターサイズと大きいクラスターサイズのどちらが適していますか?FileOptionsをFileOptions.RandomAccessに設定してFileStreamを使用します。

4

3 に答える 3

5

実行時に任意のパーティションからの読み取り用にバッファーサイズを最適化する場合は、さらに一歩進んで実行時にクラスターサイズを取得し、その倍数を読み取りバッファーに使用できます。

ただし、これを行うには、kernel32.dllからPInvokeを実行する必要があります。

GetDiskFreeSpace関数を使用して、特定のパーティションのクラスターサイズを取得します。

メソッドのシグネチャは次のとおりです。

[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
   static extern bool GetDiskFreeSpace(string lpRootPathName, 
   out uint lpSectorsPerCluster, 
   out uint lpBytesPerSector, 
   out uint lpNumberOfFreeClusters, 
   out uint lpTotalNumberOfClusters);

関心のあるドライブのルートへのパスを渡します。クラスターあたりのバイト数を取得するには、lpSectorsPerClusterにlpBytesPerSectorを掛けます。

詳細については、この関数のpinvoke.comページをご覧ください: http ://www.pinvoke.net/default.aspx/kernel32.GetDiskFreeSpace

于 2012-06-04T01:09:41.330 に答える
1

はい、ディスクから64kbのチャンクを読み取ります。クラスタサイズを小さくすると、狭い範囲の読み取りが速くなります。ファイルの断片化が増えるリスクがあります(おそらく問題ではありません)。

ただし、クラスターサイズを小さくしても、スループットを大幅に向上させることはできません。ディスクがシーク操作を実行している間に、約1MBのデータを読み取った可能性のあるデータを取得します。64kbから4kbに移行することで、ほとんど節約できません。ディスクシークにかかった時間の約1/20を節約できます。

于 2012-06-03T21:37:35.747 に答える
0

簡単だ:

クラスタサイズが小さいほど、レイテンシ(遅延)は低くなりますが、スループット(全体の平均データレート)も低くなります。

于 2012-06-03T21:39:42.640 に答える