写在文件的末尾

时间:2010-05-16 19:28:26

标签: 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).

4 个答案:

答案 0 :(得分:2)

正如上面所建议的那样,没有意义(假设你必须在文件末尾有元数据)首先写入。

这会做两件事(假设一个非稀疏文件)......   1.为整个文件分配总空间   2.随着空间的准备和等待,使任何后续的写操作更快一些。

你不能不同步吗? 至少应用程序可以转移到其他东西。

答案 1 :(得分:0)

您是否尝试过AppendAllText方法?

答案 2 :(得分:0)

您的问题并不完全清楚,但我的猜测是您创建一个文件,写入5MB,然后寻找100MB并编写元数据,然后再寻求5MB并再写5MB等等。

如果是这种情况,这是一个文件系统问题。扩展文件时,NTFS必须填补空白。如您所说,在您写入文件之前,不会分配文件。第一次编写元数据时,文件只有5MB长,因此在编写元数据时,NTFS必须在写入元数据之前分配和写出95MB的零。令人沮丧的是,我认为它也是同步进行的,所以你甚至不能使用重叠IO。

答案 3 :(得分:0)