我正在开发一个需要高文件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 :(得分:2)
正如上面所建议的那样,没有意义(假设你必须在文件末尾有元数据)首先写入。
这会做两件事(假设一个非稀疏文件)...... 1.为整个文件分配总空间 2.随着空间的准备和等待,使任何后续的写操作更快一些。
你不能不同步吗? 至少应用程序可以转移到其他东西。
答案 1 :(得分:0)
您是否尝试过AppendAllText方法?
答案 2 :(得分:0)
您的问题并不完全清楚,但我的猜测是您创建一个文件,写入5MB,然后寻找100MB并编写元数据,然后再寻求5MB并再写5MB等等。
如果是这种情况,这是一个文件系统问题。扩展文件时,NTFS必须填补空白。如您所说,在您写入文件之前,不会分配文件。第一次编写元数据时,文件只有5MB长,因此在编写元数据时,NTFS必须在写入元数据之前分配和写出95MB的零。令人沮丧的是,我认为它也是同步进行的,所以你甚至不能使用重叠IO。
答案 3 :(得分:0)
如何使用BufferedStream?
http://msdn.microsoft.com/en-us/library/system.io.bufferedstream(v=VS.100).aspx