【发布时间】:2010-05-16 19:28:26
【问题描述】:
我正在开发一个需要高文件 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).
【问题讨论】:
-
你的意思是你预先分配了 100MB,然后然后从位置 0 开始写入 5MB 的块?所以最多有 20 个块?
-
Hi Henk,一般来说代码如下(我仍在尝试理解如何格式化代码)。首先打开文件:m_Stream = new FileStream(filename, 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 _- 缓冲区长度; m_Stream.Seek(m_MetaDataSize, SeekOrigin.End); m_Stream.Write(metadata, 0, metadata.Length); m_Stream.Flush(); ==> 首次写入时间过长;
标签: c# performance file-io