2016-01-15 37 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