【发布时间】:2016-05-24 05:44:11
【问题描述】:
我有一个任务,它逐行读取一个大文件,用它做一些逻辑,然后返回一个我需要写入文件的字符串。输出的顺序无关紧要。但是,当我尝试下面的代码时,它会在读取 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);
}
}
});
为什么我的程序运行一段时间后变慢了?是否有更正确的方法来执行此任务?
【问题讨论】:
-
是否需要输出行的顺序与输入的顺序相对应?如果是这样,
Parallel.ForEach不是正确的工具。 -
我不确定,但感觉以这种方式使用并行正在创建/恶化 IO 瓶颈,而不是避免它。除非您在这些线路上进行非常昂贵的操作..
-
var file = System.IO.File.AppendText(outputFile) 可以放在 foreach 之外,因为您正在锁定它。检查这是否会提高性能。
-
你有一个用于同步的“锁”,以确保只有一个线程可以写入文件。这肯定会减慢速度,因为它会按顺序限制写操作。多个线程会一直等待,直到文件被第一个线程写入。
-
你的代码相当于说你需要用一把剪刀修剪你的草坪,但是,不要单独做(因为这会花很长时间),你会得到 100 个朋友帮你,但你说他们都得共用一把剪刀。
标签: c# parallel.foreach file-writing