gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:57:04 24 4
gpt4 key购买 nike

当我将 <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 使用量停止增加时,性能会下降。

我尝试过的:
  • 更改为异步写入
    ->无明显变化
  • 更改数组缓冲区大小
    ->无明显变化
  • fileBufferSize-> 没有显着变化,但是有一个大约 100MB 的大缓冲区,写入性能很快,当 RAM 使用量停止增加时,写入性能变为 0,过了一段时间,又回到 100MB,这表明缓存缓冲区是“冲洗"
  • fileOptionWriteThrough-> 性能总是很慢..
  • 在 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);
    }
    }
    }

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

    顺便说一句,当我运行示例代码时,无论是否使用 lock 都非常快。声明并添加 sleep 会显着减慢它的速度。

    关于file - 将大数据写入文件缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9902784/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com