【问题标题】:Log to memory and then write to file记录到内存然后写入文件
【发布时间】:2012-06-07 17:36:10
【问题描述】:

我想知道一些事情,我有一个循环运行一整天(7 次),然后在其中运行另一个循环,它针对文件中的所有记录运行。 (大约 100000),所以总共大约 700000 次,现在我想记录每个循环中的每个处理,并将其记录到文件中,假设我们第一次在第一个循环内,第一次在第二个循环内,我们每次都记录在一个文件中做了什么。但问题是,如果我每次都记录,会严重影响性能,因为IO操作太多,我在想有没有办法,我可以将每一步都记录到内存中(内存流或任何东西)然后在外循环结束时,将所有内存流数据记录到文件中?

说我有没有

for (int i=0; i<7; i++)
{
  for (int j=0; j<RecordsCount; j++)
  {
    SomeOperation();
    // I am logging to a file here right now
  }
}

它严重损害了性能,如果我删除日志文件,我可以更早完成它。所以我认为最好先登录到内存并将所有日志从内存写入文件。那么,有没有办法做到这一点?如果有很多,什么是最好的?

ps:这是我找到的一个记录器 http://www.codeproject.com/Articles/23424/TracerX-Logger-and-Viewer-for-NET,但如果需要,我可以使用任何其他自定义记录器或其他任何东西。

编辑:如果我使用内存流,然后将其全部写入文件,那么使用 File.AppendAllLines 会比 Yorye 和 zmbq 在回答中建议的性能更好,如果那样的话与 Jeremy 的评论相比,给我任何性能提升?

【问题讨论】:

  • 您是否正在寻找一个 StringBuilder 来附加所有日志记录,然后在循环记录 stringbuilder.ToString() 之后添加
  • @JeremyThompson 我也立即想到了 StringBuilder,但由于 File 有一个方法 AppendAllLines,结果证明简单地拥有一个字符串列表更有效,每个字符串都是一个日志.

标签: c# performance logging loops io


【解决方案1】:

这只是一个例子,但你可以理解。

您确实有解决方案,您只需要这样做......

for (int i=0; i<7; i++)
{
    var entries = new List<string>();

    for (int j=0; j<RecordsCount; j++)
    {
        SomeOperation();

        // Log into list
        entries.Add("Operation #" + j + " results: " + bla bla bla);
    }

    // Log all entries to file at once.
    File.AppendAllLines("logFile.txt", entries);
}

【讨论】:

  • 除此之外,记录的主要目的是跟踪所发生的事情。想象一下,程序突然崩溃,而您从一个会话中退出所有日志。
  • 是的。你赢了一些,你也输了一些。
【解决方案2】:

为什么不使用合适的日志框架而不是自己编写呢?

例如,NLog 内置了缓冲并且很容易配置:https://github.com/nlog/NLog/wiki/BufferingWrapper-target

我建议您专注于编写为您的项目带来价值的代码,同时将现有解决方案重用于所有其他内容。这可能会让你更有效率并给出更好的结果:-)

【讨论】:

【解决方案3】:

只要有足够的缓冲区,将 700,000 行记录到文件中就不会花费很长时间。实际上,与在循环外立即执行相比,如果在循环内执行它应该不会花费更长的时间。

不要使用File.AppendAllLines 或类似的东西,而是打开文件的流,确保你有一个缓冲区,然后写入。

【讨论】:

  • 并一直保持流打开?!为什么不使用 AppendAllLines?
  • 为什么不一直保持流打开?这是一个日志文件。
  • 将来支持线程?听起来他可能在某个地方已经有了一些线索。
  • 即使没有,在不必要的时候让资源保持打开状态也是不好的。这是一种(资源的)浪费。
  • 除此之外,记录的主要目的是跟踪所发生的事情。想象一下,程序突然崩溃,而您从一个会话中退出所有日志。
猜你喜欢
  • 2012-06-13
  • 2013-02-01
  • 2022-11-12
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
相关资源
最近更新 更多