Bec*_*cco 5 caching file c#-4.0
当我向文件写入大量<2GB的数据时,我遇到了问题.第一个~1.4GB数据被快速写入(100 MB/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);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为存在与缓存问题相关的问题,实际上在"快速写入性能"期间,RAM的使用量也会增加,当RAM使用率停止增加时,性能会下降.
我尝试过的:
更改为异步写入 - >没有显着变化
更改数组缓冲区大小 - >没有明显变化
更改fileBufferSize
- >没有明显的变化,但是有一个大的缓冲区~100MB,写入性能很快,当RAM使用停止增加时,写入性能变为0,然后,一段时间后,回到100MB,它接收缓存缓冲区是"酡"
更改fileOption到WriteThrough
- >性能总是慢..
在xx循环后添加fs.Flush(true)
- >没有显着变化
取消注意Thread.Sleep(10)
- >写速度总是很好.....这很奇怪
它是否在完成前一个块的写入并陷入混乱之前以某种方式尝试写入?(似乎不太可能,但是很奇怪的是Thread.Sleep应该加速它,这可以解释它)。如果您修改 using 语句内的代码来锁定文件流,会发生什么情况?
using (FileStream fs = File.Create(@"c:\testing\test.bin", fileBufferSize, fileOptions))
{
while (fs.Position < fileBufferSize)
{
lock(fs) // this is the bit I have added to try to speed it up
{
random.NextBytes(Buffer);
fs.Write(Buffer, 0, Buffer.Length);
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我已经调整了您的示例代码,以包含使其写入正确大小的文件所需的 while 循环。
顺便说一句,当我运行示例代码时,无论有没有lock语句,它都非常快,并且添加睡眠会显着减慢速度。