.NETでファイルIOを実行すると、表示される例の95%が4096バイトのバッファを使用しているようです。バッファ長には4kbほど特別なものはありますか?それとも、forループのインデックスにiを使うような大会ですか?バッファ長には4kbほど特別なものはありますか?
答えて
これは、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();
}
}
ああ、私は参照してください。それはおそらくそれのようなものだったと思った。実行時にクラスターのサイズをディスクに合わせて決定する方法はありますか? – sheikhjabootie
マネージコードを使ってクラスターサイズを取得する方法はわかりませんが、P/Invokeを使用してクラスターサイズを取得するために必要な情報を返すWin32 API関数 'GetDiskFreeSpace'を呼び出すことができます。必要な場合は、私が開発マシンにいるときに、少し後でサンプルを提供することができます。 –
@ CodeHero、クラスタサイズを決定するためのクイックサンプルを追加しました。正に言えば、私はこれまでバッファサイズを最適化しようとはしませんでした。私はむしろ4Kや8Kのようなものにいくつかのパフォーマンステストを行い、必要なパフォーマンスをどのように与えるかを見て、それを実行します。メモリが制約されているデバイスで作業していて、4Kバッファを用意する余裕がない場合は、4Kを下回る時間しかありません。 –
を取得するために私の推測では、それは、.NET上でOSファイルのブロック・サイズ--- Windowsに関連していることだろう。
2人の南アフリカ人が、SOの同じ質問に世界の反対側から答えていると想像してください。 –
私は今このコメントを見ました:) ---はい、私たちはどこにでもいます! –
いくつかの要因:
- 多くの場合、4Kは、ディスクドライブのクラスタサイズ
- 4Kは、Windows上で最も一般的なページサイズですので、OSは4Kのメモリ・マップ・ファイルをすることができますチャンク
- 4Kページは、コピーされずにドライブからOSにユーザープロセスに転送されることがよくあります。
- Windowsは4Kバッファを使用してRAMにファイルをキャッシュします。
は、最も重要なのは長年にわたって多くの人々は、したがって、IOとOSのコードの多くは、4Kバッファ用に最適化され、上記のために自分のバッファ長として4Kを使用しています!
- 1. 特別な角括弧(| ... |)はどのようなものになりますか?
- 2. SSEプログラムは、IntelよりもAMDのほうがかなり長いです。
- 3. 新しいHTML5メニュー要素には特別なものがありますか?
- 4. 灰皿には特別な力はありますか?
- 5. Safari for WindowsとAJAXの特別なものはありますか?
- 6. コンソールの特別な名前はwin32にありますか?
- 7. makefileに$(MAKE)に特別な意味はありますか?
- 8. `origin`には特別な意味がありますか?
- 9. wgetについて特別なことはありますか?
- 10. C#はダブルセミコロンを許可しますか? ;もしそうなら、特別な方法はありますか?
- 11. uuencoding/uudecodingの特別なバリエーションはありますか?
- 12. UIButtonの特別なタグはありますか?
- 13. プロパティと呼ばれるMVCコントローラに特別なものがありますか?
- 14. min-heightを使って何か特別なものがありますか?
- 15. プリズムインフラストラクチャプロジェクトにはどのようなものがありますか?
- 16. クロージャーには特別なものは何ですか?
- 17. F#見積もりの別の制限はありますか?
- 18. フィールドにMongoDBの特別なシンボルがありますか?
- 19. 特別なラインをスムーズにフォローする必要があります。他の動作もあります。
- 20. Qt Creatorのプロジェクトファイルに外部ファイルの特別なカテゴリはありますか?
- 21. sendtoの最大バッファ長は?
- 22. AJAXには特別なセキュリティ上の懸念がありますか?
- 23. EventArgsクラスとイベントキーワードの間に特別な関連付けはありますか?
- 24. Perl:特別な配列@_は本当にエイリアスではありませんか?
- 25. orm BLToolkitはそれほど人気がありませんか?
- 26. Monadsについて特別なものは何ですか?
- 27. Railsアプリケーションは、データベースではなくボトルネックになるほど遅くなる可能性がありますか?
- 28. Xcodeのメモリリークプロファイラ - どれほど信頼性がありますか?
- 29. 「ベアラ」認可ヘッダには特別な意味がありますか?
- 30. 長期的なJavaプロファイラまたはパフォーマンスロガーはありますか?
[最適なファイルバッファの読み取りサイズ?](http://stackoverflow.com/questions/1552107/optimum-file-buffer-read-size) –