记录到内存,然后写入文件

本文关键字:文件 然后 内存 记录 | 更新日期: 2023-09-27 18:36:04

我想知道一些事情,我有一个运行所有天(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 找到的记录器,但如果需要,我可以使用任何其他自定义记录器或其他任何东西。

编辑:如果我使用内存流,然后将其全部写入文件,这会给我更好的性能,然后按照 Yorye 和 zmbq 的回答使用File.AppendAllLines,如果这会给我带来任何性能提升杰里米评论?

记录到内存,然后写入文件

这只是一个例子,但你可以得到这个想法。

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

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

为什么不使用适当的日志记录框架而不是编写自己的日志记录框架?

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

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

只要

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

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