c# - 在文件末尾写入

标签 c# performance file-io

我正在开发一个需要高文件 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/

相关文章:

c# - 使用属性扩展 C# 中的类

java - 尝试打印无框图像

java - 文件IO和异常处理错误

C# 从 System.Net.Http.StringContent 读取(不是写入!)字符串

c# - 在 C# 中使用 UPDATE MySQL 命令

c# - 与 Sqlexpress 连接

c++ - 从纯文本中读取真值表,将其转换为 C++ 中的 map<int,list<int>>

multithreading - 为什么我使用 openMP atomic 的并行代码比串行代码花费更长的时间?

performance - 文本域 Controller 方法使性能下降

ruby-on-rails - 对象实例的未定义​​方法 `includes'