当我写入一个超过2GB的大文件时,出现了问题。前1.4GB数据写入速度很快(100MB/s),但之后代码变得非常缓慢(0-2 MB/s)。
我的代码如下(简化版):
//FileOptions FILE_FLAG_NO_BUFFERING = (FileOptions)0x20000000;
FileOptions fileOptions = FileOptions.SequentialScan;
int fileBufferSize = 1024 * 1024;
byte[] Buffer = new byte[32768];
Random random = new Random();
long fileSize = 2588490188;
long totalByteWritten = 0;
using (FileStream fs = File.Create(@"c:\test\test.bin", fileBufferSize, fileOptions))
{
while (totalByteWritten < fileSize)
{
random.NextBytes(Buffer);
fs.Write(Buffer, 0, Buffer.Length);
totalByteWritten += Buffer.Length;
//Thread.Sleep(10);
}
}
我认为这与缓存问题有关,在“快速写入性能”期间,RAM使用量也会增加,当RAM使用量停止增长时,性能会下降。
我尝试过:
更改为异步写入->没有显著变化
更改数组缓冲区大小->没有显著变化
更改
fileBufferSize
->没有显著变化,但是使用大缓冲区(约100MB)时,写入性能很快,当RAM使用量停止增长时,写入性能降为0,然后一段时间后回到100MB,似乎缓存缓冲区被“刷新”将
fileOption
更改为WriteThrough
->性能始终很慢..在xx个循环之后添加
fs.Flush(true)
->没有显著变化取消注释
Thread.Sleep(10)
->写入速度始终很好.....这很奇怪