记录到内存然后写入文件

时间:2012-06-03 04:23:25

标签: c# performance logging loops io

我想知道一些事情,我有这个循环运行了一整天(7次),然后是另一个循环,它运行文件中的所有记录。 (大约100000),所以总共约70万次,现在我想记录每个循环中的每个处理,并将其记录到文件中,比如我们第一次进入第一次循环,第一次进入第二次循环,我们每次记录,在文件中完成的操作。但问题是,如果我每次都要记录,那么性能会受到极大的影响,因为有太多的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的记录器,但如果需要,我可以使用任何其他自定义记录器或其他任何东西。

编辑:如果我使用内存流,然后将其全部写入文件,那么这会给我提供更好的性能,然后按照Yorye和zmbq的回答建议使用File.AppendAllLines,如果那能否让我获得超过杰里米评论的任何表现?

3 个答案:

答案 0 :(得分:2)

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

你真的有解决方案,你只需要这样做......

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);
}

答案 1 :(得分:1)

为什么不使用正确的日志框架而不是自己编写?

NLog for instance内置缓冲,配置简单:https://github.com/nlog/NLog/wiki/BufferingWrapper-target

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

答案 2 :(得分:0)

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

不要使用File.AppendAllLines或类似的东西,而是打开文件流,确保你有一个缓冲区,并通过它进行书写。