【问题标题】:Writing at the end of file在文件末尾写入
【发布时间】: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


【解决方案1】:

如上所述,它是否没有意义(假设您必须在文件末尾有元数据)先写。

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

您不能异步执行此操作吗? 至少应用程序可以继续做其他事情。

【讨论】:

    【解决方案2】:

    你试过AppendAllText方法吗?

    【讨论】:

    • 非常感谢您的快速回复。我害怕得到这些答案 :-) 将元数据移动到文件末尾以外的任何其他地方都是有问题的,但我看起来没有任何其他选择。非常感谢大家
    • 为什么要调用 Flush()?您希望通过这样做获得什么?
    【解决方案3】:

    您的问题并不完全清楚,但我猜您创建一个文件,写入 5MB,然后寻找 100MB 并写入元数据,然后寻找回 5MB 并写入另一个 5MB,依此类推。

    如果是这样,这是一个文件系统问题。当您扩展文件时,NTFS 必须用一些东西来填补空白。正如您所说,在您写入文件之前不会分配该文件。第一次写入元数据时,文件只有 5MB 长,因此当您写入元数据时,NTFS 必须在写入元数据之前分配并写出 95MB 的零。令人沮丧的是,我认为它也同步执行此操作,因此您甚至无法使用重叠 IO。

    【讨论】:

    • 错了,FS 不必在两者之间“写”任何东西。
    • 你确定吗? NTFS 绝对支持稀疏文件,但默认情况下不使用它们,您需要特殊的操作系统权限才能启用它们。这表明 95MB 的未使用文件实际上确实需要分配和归零。
    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 1970-01-01
      • 2014-02-04
      • 2011-04-14
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      相关资源
      最近更新 更多