2MBから5GBのファイルをディスクに書き込むとします。 FileStreamの分かりやすいバッファ値は何ですか?C#FileStream:大きなファイルを書き込むための最適なバッファサイズ?
数メガバイトのバッファサイズで動作するのが賢明でしょうか、またはキロバイトのバッファに固定する必要がありますか?
2MBから5GBのファイルをディスクに書き込むとします。 FileStreamの分かりやすいバッファ値は何ですか?C#FileStream:大きなファイルを書き込むための最適なバッファサイズ?
数メガバイトのバッファサイズで動作するのが賢明でしょうか、またはキロバイトのバッファに固定する必要がありますか?
デフォルトのバッファサイズは4 KiBです。
また、ここで見てみましょう:参照文書に基づいてSequential File Programming Patterns and Performance with .NET
http://msdn.microsoft.com/en-us/library/dd783870.aspxデフォルトのサイズは「4096バイト」 – VMAtm
System.IO.FileStreamを逆コンパイルしただけです。内部const int DefaultBufferSize = 4096; – Vladimirs
@ VMAtm - その参照は、(FileStreamクラスが通常内部的に使用するものについての質問に答えるという点で)偽です。 CopyToバッファサイズは、正確には80 KiBよりかなり大きい。私はここでいくつかのIOファイルのパフォーマンス特性の.NETの書き込みをしました(http://stackoverflow.com/questions/1540658/net-asynchronous-stream-read-write/19692949#19692949) –
小さなクイックベンチマークは、128キロバイトのバッファサイズよりも大きい私のシステム上でのパフォーマンスの増加を示しません。あなたの走行距離は、以下のものを自由に使用することができます。
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();
}
+1のベンチマークOPは書き込みバッファサイズを要求しました。しかし、アプローチは妥当です。 –
Hm、あなたのコメントは自分自身と矛盾します。あなたは 'size = 256 KB'と言うが、同時に' i = 18'と主張し、 '2 << 18'は実際には512 KBと言う。 – Timwi
2 << 18 == 262144バイト1024バイト(キロバイト)なので、256 KBです。私は何が欠けていますか? – Firestrand
なぜ、.Netはバッファを処理し、必要に応じて書き込みますか? – cjk
ただ試してみてください。 StopWatchを使用して少しベンチマークを書いて、結果を教えてください。 –
私は問題の「バッファ」があなたがいるときに宣言しなければならないバッファだと思っています。あるストリームから別のストリームへのコピー(つまり、1回の反復でどれくらいのバイトを読み、次に書き込みを行うか)。 –