2016-01-15 35 views
0

我正在逐行阅读大约300个文本文件,每个文件的大小为50到70 MB。我正在使用StreamReaderStreamWriter来读取和写入文件。目前,我正在使用foreach循环进行迭代,并且需要8到10分钟才能读取整个文件夹。 我是新来的TPL概念,不知道如何实现它来读取数百个文本文件的文件夹。任何人都可以通过给出一个代码片段来帮助我,它显示了如何使用任务更快地读取文件。使用任务(TPL概念)读取大量文本文件

+3

这将是IO绑定而不是计算绑定,并且使用多个线程不太可能加速它 - 实际上,使用多个线程访问硬盘可能会减慢速度,因为可怜的磁盘头向后飞并转发... –

回答

0

您可以创建多个任务并使用WaitAll方法等到所有完成。

List<Task> tasks = new List<Task>(); 
foreach (var file in someFileList) 
{ 
    tasks.add(Task.Factory.StartNew(() => 
     {    
      ProcessFile(file); 
     }); 
    ); 
} 

Task.WaitAll(tasks.toArray()); 
+1

-1使用'Task.Factory.StartNew'(而不是'Task.Run')和'Task.WaitAll'(而不是'await Task.WhenAll'。它是2016年,停止使用阻止的时间当有易于使用的替代方法时调用 – kai

+0

另外,当我们执行IO绑定时,通常没有什么意义可以产生大量的线程,使用IO API会暴露自然的异步方法,或者不要执行它们异步。 – kai

1

如果您使用的是HDD,这已经很快了。

我假设你的瓶颈是IO。但是,如果它是CPU(对文件执行一些大的操作),并且你有一个SSD或任何其他介质访问时间可以忽略不计,我建议你也看看Parallel.ForEach

Parallel.ForEach(files, (currentFile) => 
    { 
     using (FileStream fs = File.Open(currentFile, FileMode.Open)) 
     using (StreamReader sr = new StreamReader(fs)) 
     { 
       string s; 
       while ((s = sr.ReadLine()) != null) 
       { 
        //do your stuff here 
       } 
     } 
    }); 

当在磁性机械硬盘上进行IO操作时,不要使用并行方法。

+0

'FileStream'已*默认被缓冲。它的构造函数也有[一个允许指定非默认大小的重载](https://msdn.microsoft.com/en-us/libr进制/ f20d7x6t%28V = vs.110%29.aspx)。同样,'StreamReader'也有一个构造函数来选择缓冲区大小。 –

+0

@MthetheWWatson哦,它合并了。傻我。 http://blogs.msdn.com/b/brada/archive/2004/04/15/114329.aspx我会编辑答案。 – AlexanderMP