我正在开发一个需要高文件 I/O 性能的系统(使用 C#)。 基本上,我从文件开头到文件结尾填充大文件 (~100MB)。 每隔约 5 秒,我将向文件添加约 5MB(从文件的开头按顺序),在我刷新流的每个批量上。 每隔几分钟,我需要更新一个写在文件末尾的结构(某种元数据)。
当冲洗每一个批量时,我没有性能问题。 但是,在文件末尾更新元数据时,我的性能非常低。 我的猜测是,在创建文件时(也应该特别快地完成),文件并没有真正在磁盘上分配整个 100MB,当我刷新元数据时,它必须分配所有空间,直到文件末尾。
男生/女生,知道我该如何克服这个问题吗?
非常感谢!
来自评论:
一般来说代码如下,首先打开文件:
m_Stream = new FileStream(filename,
FileMode.CreateNew,
FileAccess.Write,
FileShare.Write, 8192, false);
m_Stream.SetLength(100*1024*1024);
我每隔几秒钟就写 ~5MB。
m_Stream.Seek(m_LastPosition, SeekOrigin.Begin);
m_Stream.Write(buffer, 0, buffer.Length);
m_Stream.Flush();
m_LastPosition += buffer.Length; // HH: guessed the +=
m_Stream.Seek(m_MetaDataSize, SeekOrigin.End);
m_Stream.Write(metadata, 0, metadata.Length);
m_Stream.Flush(); // Takes too long on the first time(~1 sec).
最佳答案
如上所建议的那样(假设你必须在文件末尾有元数据)先写它是不是没有意义。
那会做两件事(假设是一个非稀疏文件)... 1.分配整个文件的总空间 2. 当空间准备好并等待时,使任何后续写入操作更快一些。
你不能异步地做这个吗? 至少应用程序可以继续处理其他事情。
关于c# - 在文件末尾写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845140/