1

我想知道一些事情,我有一个循环运行一整天(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 评论的任何性能提升吗?

4

3 回答 3

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);
}
于 2012-06-03T04:45:12.627 回答
1

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

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

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

于 2012-06-03T20:27:43.577 回答
0

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

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

于 2012-06-03T04:51:30.333 回答