我想知道一些事情,我有这个循环运行了一整天(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
,如果那能否让我获得超过杰里米评论的任何表现?
答案 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
或类似的东西,而是打开文件流,确保你有一个缓冲区,并通过它进行书写。