并行读取非常大的文件C#

时间:2018-03-28 06:04:20

标签: c# multithreading streamreader

我有超过20个文件,每个文件包含近100万行(5千兆字节),我需要加快读取过程,所以我试图并行读取这些文件,但它需要比按顺序阅读它们。是否有任何方法可以并行读取非常大的文件?

 Parallel.ForEach(sourceFilesList, filePath =>
 {
     if (!string.IsNullOrEmpty(filePath) && File.Exists(filePath))
     {
          StreamReader str = new StreamReader(filePath);
          while (!str.EndOfStream)
          {
              var temporaryObj = new object();
              string line = str.ReadLine();
              // process line here 
          }
     }
});

2 个答案:

答案 0 :(得分:3)

最好将缓冲读卡器用于大文件。这样的事情会有所帮助。

using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, 
FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
    string line;
    while ((line = sr.ReadLine()) != null)
    {

    }
}

为什么BufferedStream更快

缓冲区是内存中用于缓存数据的字节块,从而减少了对操作系统的调用次数。缓冲区可提高读写性能。缓冲区可用于读取或写入,但不能同时使用。 BufferedStream的Read和Write方法自动维护缓冲区。

答案 1 :(得分:1)

它的IO操作,建议是使用Async / Await,如下所示(大多使用ReadAsync函数,这有助于异步读取),Async / Await使用你{{1}有效率。

Machine Physical Core

代码取自MSDN:Using Async for File Access (C# and Visual Basic)