首页 > 解决方案 > 如何在大文件的所有行上使用 Parallel.ForEach 循环

问题描述

我想使用 Parallel.ForEach 循环一个大文件(2GB 文件)的所有行。

我目前正在foreach这样使用:

var lines = File.ReadLines(fileName);
foreach (var line in lines) {
  // Process line
}

是否可以将其转换为Parallel.ForEach并使用File.ReadLinestoo 因为它不消耗更多内存?

任何帮助,将不胜感激。

谢谢!

标签: c#foreachparallel.foreach

解决方案


怎么样

using (var linesDisposable = File.ReadLines(fileName) as IDisposable)
{
    var lines = linesDisposable as IEnumerable<string>;
    Parallel.ForEach<string>(lines,  line => {
        //Process(line);
    });
}

请注意,“使用 + IDisposable”是最佳实践。底层的线路流实现了 IDisposable 并且谨慎使用它。如果我们省略“使用”,那么如果/当对“进程()”的调用引发异常时,流将不会自动处理,这可能会导致各种问题,因为文件将被底层操作系统锁定(所以我们将无法删除它等)。

脚注:如果您使用的是 dotnet-core,您可能还想像这样简化嵌套:

using var linesDisposable = File.ReadLines(fileName) as IDisposable;
var lines = linesDisposable as IEnumerable<string>;
Parallel.ForEach<string>(lines,  line => {
   //Process(line);
});

推荐阅读