【问题标题】:Most efficient way to create and write multiple 10 KB text files?创建和写入多个 10 KB 文本文件的最有效方法是什么?
【发布时间】:2009-11-18 13:26:29
【问题描述】:

我们使用以下方法来写出文本文件:

public void WriteFile(string filePath, string contents)
{
    if (string.IsNullOrEmpty(filePath)) { throw new ArgumentNullException("filePath"); }
    if (contents == null) { throw new ArgumentNullException("contents"); }

    if (File.Exists(filePath))
    {
        throw new InvalidOperationException(string.Format("The file '{0}' already exists", filePath));
    }

    StreamWriter sw = File.CreateText(filePath); // slow

    sw.Write(contents);
    sw.Close(); // slow
}

我们多次调用这个函数,所以性能是关键。注释slow 的两行代码是我们的应用程序花费大部分时间的地方。

参数contents 平均包含大约 10 KB 的文本。

.NET 或使用 Win32 API 的其他方法是否已知具有明显更好的性能?

我们已经尝试了以下方法:

TextWriter tw = new StreamWriter(filePath);

tw.Write(contents);
tw.Close();

但发现性能与我们最初的方法相似。

编辑

根据我们也尝试过的建议:

File.WriteAllText(filePath, contents);

但是,这种方法的性能与上面列出的其他方法相似。

【问题讨论】:

  • 您尚未指定此写入的速度有多慢。说你的程序大部分时间都花在了那里,如果它以硬件允许的速度写那 10k 段文本,那并没有任何意义。
  • “慢”有多慢?请记住,大多数使用硬盘的工作比使用内存要慢得多......如果我们只是在写入期间谈论 3-5 毫秒的延迟,我不确定有很多事情要做...
  • @ApoY2K:我假设 Richard E 的意思是他正在编写许多不同的文件。如果他一遍又一遍地写相同的文件,你有一个很好的观点:-)
  • @scraimer, @ApoY2k:我正在写出许多不同的文件,已更新标题以反映这一点。

标签: .net performance file winapi file-io


【解决方案1】:

听起来像是 backgroundworker. 的工作 将写入任务卸载到新线程,并通过事件通知您/用户进度和完成情况。

【讨论】:

    【解决方案2】:

    写文件最直接的方式是:

    File.WriteAllText(filePath, contents);
    

    如果您对此有性能问题,则应查看您的要求。由于确实没有任何操作部分可以更有效地完成,因此您应该确定是否可以跳过或稍后完成操作的任何部分。

    例如,退出方法时是否需要将文件完全写入并关闭?否则,您可以将任务放入队列中,让后台线程按照自己的节奏逐个写入文件。

    【讨论】:

      【解决方案3】:

      忘记你的代码。使用硬盘时的性能问题是文件系统问题、操作系统问题,当然还有硬件质量问题。

      我唯一能建议的就是重新设计您的应用程序。例如,您可以编写大文件而不是大量小文件。只需对所有文件都使用 .tar 归档,因为它不会压缩任何内容,而只是一个一个地存储文件流。

      【讨论】:

        【解决方案4】:

        您可以创建另一个线程以 8k 数据块(内部缓冲区大小)异步写入文件。

        【讨论】:

          【解决方案5】:

          【讨论】:

            【解决方案6】:

            sw.写... sw.Flush(); // 插入新行 sw.Close()...

            如果您在上面插入新行,您可能会在数据写入磁盘时看到“缓慢”移动到该行。

            您是否正在运行可以禁用的病毒扫描软件? 你能在你的电池备份磁盘控制器中启用写缓存吗?

            【讨论】:

              猜你喜欢
              • 2011-12-06
              • 1970-01-01
              • 1970-01-01
              • 2016-11-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-06-17
              • 2014-01-28
              相关资源
              最近更新 更多