【问题标题】:Write large data to file caching issue将大数据写入文件缓存问题
【发布时间】: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 仅用作随机数据生成器

标签: file caching c#-4.0


【解决方案1】:

它是否在写完前一个块并陷入混乱之前以某种方式尝试写? (似乎不太可能,但很奇怪 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);
    }
  }
}

编辑:我已经调整了您的示例代码以包含使其写入正确大小的文件所需的 while 循环。

顺便说一句,当我运行示例代码时,无论是否使用 lock 语句,它都非常快,并且添加睡眠会显着减慢它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2018-09-28
    • 1970-01-01
    • 2020-11-07
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多