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

C# 记录到内存,然后写入文件,c#,performance,logging,loops,io,C#,Performance,Logging,Loops,Io,我想知道一些事情,我有一个循环,它运行了所有天(7次),然后在它里面有另一个循环,它运行文件中的所有记录。(大约100000次),总的来说大约是700000次,现在我想记录每个循环中的每个处理,并将其记录到一个文件中,假设我们第一次在第一个循环中,第二个循环第一次,我们每次记录,在一个文件中做了什么。但问题是,如果每次都记录,会严重影响性能,因为有这么多IO操作,我想有没有办法,我可以将每个步骤记录到内存(内存流或任何东西),然后在外循环结束时,将所有内存流数据记录到文件中 说如果我有 for

我想知道一些事情,我有一个循环,它运行了所有天(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
  }
}

for(inti=0;i这只是一个示例,但您可以理解

你真的找到了解决办法,你只需要去做

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

for(int i=0;i只要有足够的缓冲区,将700000行记录到一个文件不应该花费所有的时间。事实上,与在循环外一次记录相比,在循环内记录不会花费更长的时间


不要使用
文件。附加所有行
或类似的内容,而是打开文件流,确保有缓冲区,然后进行写入。

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

例如,NLog具有内置缓冲功能,易于配置:


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

您是否正在寻找一个StringBuilder来附加所有日志,然后在循环日志之后再添加StringBuilder.ToString()@JeremyThompson我也立即想到了StringBuilder,但是既然
文件
有一个方法
AppendAllLines
,那么简单地拥有一个字符串列表(每个字符串都是一个日志)就更有效了。并且让流始终保持打开状态?!无论如何,为什么不使用AppendAllLines呢?为什么不让流一直保持打开状态呢整个时间?这是一个日志文件。将来支持线程?听起来他可能已经在某个地方有了一些线程。即使没有,在不必要的时候让资源打开也是不好的。这是一种浪费(资源)。除此之外,日志记录的主要目的是跟踪所发生的事情。假设程序突然崩溃,您从一个会话中释放了所有日志记录。除此之外,日志记录的主要目的是跟踪所发生的事情。假设程序突然崩溃,您从一个会话中释放了所有日志记录一个会话的ut。正确。你赢了一些,你输了一些。链接已移到此处: