如何解决在 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);
}
}
据我所知,这应该可以正常工作。但我知道,在单个流的情况下,顺序读/写比来回跳转要快。个别地,我将按顺序使用 headerStream
和 dataStream
,但我不确定这是否会缓解问题,因为对文件的读取和写入将在标头和数据之间交替.在每个流/每个文件句柄的基础上,还是在每个文件的基础上,无论附加了多少个流,重要的是顺序吗?
我可以想到避免这个问题的替代解决方案,但它们似乎都有自己的性能问题,通常涉及复制内存:
- 将整个文件加载到
MemoryStream
中,然后直接从该文件而不是FileStream
中读取和写入,然后将其保存回来。 - 通过复制文件、读取原始文件并写入副本,然后用副本替换原始文件来执行“双缓冲”。
- 一步将标头加载到内存中的数据结构中,然后对其进行迭代以确定写入的位置。
是否有任何理由选择上述解决方案之一?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。