【发布时间】:2012-04-11 18:23:26
【问题描述】:
当我将
我的代码(简化)是:
//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)->写入速度总是很好.....这很奇怪
【问题讨论】:
-
似乎 thread.sleep 正在帮助清除内存并将其转储到磁盘。你能对你的高清写入速度做一个基准测试吗?我认为在开始时所有内容都被写入内存,直到它已满,然后两个 Windows 分页文件都被写入(因为你最大化了内存)并且你的文件继续写入,所以性能越来越低。但我可能错了:)
-
系统上运行的某些防病毒软件是否会在 RAM 被填满并且数据开始写入磁盘后降低性能?
-
嗯,据我了解,“FileOptions.SequentialScan”在您的场景中根本没有用。这在从光盘读取而不是写入时很重要。据我了解,这只是一个简化的代码 sn-p,所以我猜“random.NextBytes”只是你真实数据的占位符。真实数据从何而来?收集真实数据会是罪魁祸首吗?
-
我会检查高清写入速度。并且没有杀毒软件,我在删除杀毒软件后做了同样的测试。真实数据来自千兆以太网或来自对大文件的某些分析,random.NextBytes 仅用作随机数据生成器