私は大きなファイルを1行ずつ読み込み、いくつかのロジックを行い、ファイルに書き込む必要のある文字列を返すタスクを持っています。出力の順序は関係ありません。しかし、以下のコードを試してみると、私のファイルの15〜20k行を読み終えた後は、実際には停止/停止が遅くなります。Parallel.ForEachを使ってファイルに正しく書き込む方法は?
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);
}
}
});
時間が経過してプログラムが遅くなるのはなぜですか?このタスクを実行するより正しい方法はありますか?
は、あなたがに対応する出力ラインの順序が必要です:
迅速な回避策は、
ParallelOptions
を受け入れそうのようなオーバーロードを使用して、参加することが許可されているスレッドParallel.ForEach
の数を制限することです入力順?もしそうなら、 'Parallel.ForEach'は適切なツールではありません。 – adv12いいえ、出力行の順序は関係ありません。 – justindao
私はよく分かりませんが、このようにパラレルを使用することは、IOのボトルネックを回避/回避することです。あなたがそれらの行に__really expensive__操作をしていない限り.. – TaW