我有一个任务,它逐行读取一个大文件,用它做一些逻辑,然后返回一个我需要写入文件的字符串。输出的顺序无关紧要。但是,当我尝试下面的代码时,它在读取我的文件的 15-20k 行后停止/变得非常慢。
public static Object FileLock = new Object();
...
Parallel.ForEach(System.IO.File.ReadLines(inputFile), (line, _, lineNumber) =>
{
var output = MyComplexMethodReturnsAString(line);
lock (FileLock)
{
using (var file = System.IO.File.AppendText(outputFile))
{
file.WriteLine(output);
}
}
});
为什么我的程序运行一段时间后变慢了?有没有更正确的方法来执行此任务?
最佳答案
您实际上已经通过让所有线程尝试写入文件来序列化您的查询。相反,您应该计算需要编写的内容,然后在最后写下它们。
var processedLines = File.ReadLines(inputFile).AsParallel()
.Select(l => MyComplexMethodReturnsAString(l));
File.AppendAllLines(outputFile, processedLines);
如果您需要刷新数据,请打开一个流并启用自动刷新(或手动刷新):
var processedLines = File.ReadLines(inputFile).AsParallel()
.Select(l => MyComplexMethodReturnsAString(l));
using (var output = File.AppendText(outputFile))
{
output.AutoFlush = true;
foreach (var processedLine in processedLines)
output.WriteLine(processedLine);
}
关于c# - 如何使用 Parallel.ForEach 正确写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373381/