微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Windows 上,同时读取和写入同一个文件通过 .NET会导致性能下降吗?

如何解决在 Windows 上,同时读取和写入同一个文件通过 .NET会导致性能下降吗?

我有一个包含两个部分的自描述文件格式:一个描述数据布局的标题,然后是一个包含数据本身的 blob。我想就地转换文件中的数据,这意味着迭代标题并在某些点更新数据部分。我正在考虑使用这样的一段代码

using(Stream headerStream = File.Open(path,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)
using(Stream dataStream = File.Open(path,FileAccess.Write,FileShare.ReadWrite)
{
    headerStream.Seek(startOfheader);
    dataStream.Seek(startOfData);

    long pos;
    while(FindNextWritePos(headerStream,out pos) {
        var data = GetNewDataForPos(pos);

        // the header lists the data in the order it appears in the file,so this will never jump very far or backwards
        dataStream.Seek(pos); 

        WriteData(dataStream,data);
    }
}

据我所知,这应该可以正常工作。但我知道,在单个流的情况下,顺序读/写比来回跳转要快。个别地,我将按顺序使用 headerStreamdataStream,但我不确定这是否会缓解问题,因为对文件的读取和写入将在标头和数据之间交替.在每个流/每个文件句柄的基础上,还是在每个文件的基础上,无论附加了多少个流,重要的是顺序吗?

我可以想到避免这个问题的替代解决方案,但它们似乎都有自己的性能问题,通常涉及复制内存:

  • 将整个文件加载到 MemoryStream 中,然后直接从该文件而不是 FileStream 中读取和写入,然后将其保存回来。
  • 通过复制文件、读取原始文件并写入副本,然后用副本替换原始文件来执行“双缓冲”。
  • 一步将标头加载到内存中的数据结构中,然后对其进行迭代以确定写入的位置。

是否有任何理由选择上述解决方案之一?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。