将大数据写入文件缓存问题

时间:2012-03-28 07:14:59

标签: file caching 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);
        }
    }

我认为存在与缓存问题相关的问题,实际上在“快速写入性能”期间,RAM的使用量也会增加,当RAM使用率停止增加时,性能会下降。

我尝试过:

  • 更改为异步写入 - &gt;没有明显改变

  • 更改数组缓冲区大小 - &gt;没有明显改变

  • 更改fileBufferSize - &gt;没有明显的变化,但是有一个大的缓冲区~100MB,写入性能很快,当RAM使用停止增加时,写入性能变为0,并且一段时间后,回到100MB,它接收缓存缓冲区是“冲洗”

  • fileOption更改为WriteThrough - &gt;表现总是很慢..

  • 在xx循环后添加fs.Flush(true) - &gt;没有明显改变

  • 取消注释Thread.Sleep(10) - &gt;写入速度总是很好.....这很奇怪

1 个答案:

答案 0 :(得分:0)

在它写完前一个块并陷入混乱之前,它是否以某种方式尝试编写? (似乎不太可能,但是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语句,它都会非常快,并且添加睡眠会显着减慢它。