在文件末尾写入

问题描述:

我正在研究需要高文件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). 
+0

请向我们显示您的代码。 – SLaks 2010-05-16 19:34:40

+0

你的意思是你预先分配了100MB,然后_then_ start从0开始写入5MB块?所以最多有20块? – 2010-05-16 19:37:45

+0

嗨亨克, 一般来说,代码如下(我仍然试图了解如何格式化代码)。: 首先打开文件: m_Stream =新的FileStream(文件名,FileMode.CreateNew,FileAccess.Write,FileShare.Write,8192,假); 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; m_Stream.Seek(m_MetaDataSize,SeekOrigin.End); m_Stream.Write(metadata,0,metadata.Length); m_Stream.Flush(); ==>首次写入时间过长; – 2010-05-16 20:14:31

如上文建议将它没有任何意义(假设你必须在文件末尾的元数据)写的第一。

这会做2件事(假设非稀疏文件)... 1.为整个文件分配总空间 2.随着空间准备好并等待,使以下任何写入操作稍快一点。

你能不能做到这一点asyncronously? 至少应用程序可以转向其他事情。

您是否试过AppendAllText方法?

+0

非常感谢您的快速回复。 我怕得到这些答案:-) 移动元数据比文件末尾以外的任何其他地方是有问题的,但我的样子,我没有任何其他选择。 非常感谢 – 2010-05-16 20:06:44

+0

你为什么叫Flush()?你期望通过这样做获得什么? – Stewart 2010-05-16 22:20:37

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

如果是这样的话,这是一个文件系统的问题。当你扩展文件时,NTFS必须填补一些空缺。正如你所说,文件在你写入之前不会被分配。第一次写元数据时,文件只有5MB长,所以当你编写元数据时,NTFS必须在写元数据之前分配并写出95MB的零。令人不安的是,我认为它也是同步的,所以你甚至不会使用重叠的IO。

+0

错误的是,FS不必'写'任何东西。 – 2010-05-16 20:28:24

+0

你确定吗? NTFS绝对支持稀疏文件,但默认情况下它不会使用它们,您需要特殊的操作系统权限才能启用它们。这表明95MB未使用的文件实际上需要分配和归零。 – Stewart 2010-05-16 21:56:45