c# - 如何使用 Parallel.ForEach 正确写入文件?

标签 c# parallel.foreach file-writing

我有一个任务,它逐行读取一个大文件,用它做一些逻辑,然后返回一个我需要写入文件的字符串。输出的顺序无关紧要。但是,当我尝试下面的代码时,它在读取我的文件的 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/

相关文章:

c# - c#中图像的边框

c# - 如何使用分区从 Parallel.ForEach 填充和返回 List<T>

python - CSV 写入文件困难

rust - 如何将十六进制数字而不是&[u8]写入文件

c# - 如何使用 Azure Functions V2 函数中的 ILogger<T>?

c# - 如何在 Eto 中捕获没有文本框的键盘输入

c# - 从 List<string> of words 生成最多 X 长度的所有组合

c# - Parallel.foreach 不处理所有项目

c# - .NET6 中具有优先级队列的 Parallel.ForEach

Java:快速获取数据:存储在内存中与从文件中读取