我正在逐行閱讀大約300個文本文件,每個文件的大小爲50到70 MB。我正在使用StreamReader
和StreamWriter
來讀取和寫入文件。目前,我正在使用foreach
循環進行迭代,並且需要8到10分鐘才能讀取整個文件夾。 我是新來的TPL概念,不知道如何實現它來讀取數百個文本文件的文件夾。任何人都可以通過給出一個代碼片段來幫助我,它顯示瞭如何使用任務更快地讀取文件。使用任務(TPL概念)讀取大量文本文件
回答
您可以創建多個任務並使用WaitAll
方法等到所有完成。
List<Task> tasks = new List<Task>();
foreach (var file in someFileList)
{
tasks.add(Task.Factory.StartNew(() =>
{
ProcessFile(file);
});
);
}
Task.WaitAll(tasks.toArray());
如果您使用的是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操作時,不要使用並行方法。
'FileStream'已*默認被緩衝。它的構造函數也有[一個允許指定非默認大小的重載](https://msdn.microsoft.com/en-us/libr進制/ f20d7x6t%28V = vs.110%29.aspx)。同樣,'StreamReader'也有一個構造函數來選擇緩衝區大小。 –
@MthetheWWatson哦,它合併了。傻我。 http://blogs.msdn.com/b/brada/archive/2004/04/15/114329.aspx我會編輯答案。 – AlexanderMP
- 1. 蟒蛇:讀取文件名和文件概念的文件夾
- 2. 在java中使用線程概念讀取N個文件
- 3. 使用ASYNC讀取JSON文件任務
- 4. app.config文件的概念
- 5. 文件I/O概念
- 6. 概念批量腳本
- 7. 使用Wordnet抽取概念
- 8. 使用TPL限制任務數量
- 9. 如何使用input.properties像概念文件在TCL腳本
- 10. 使用php腳本從遠程服務器讀取大文件
- 11. TPL中的最大任務?
- 12. 概念提取
- 13. 如何讀取大文本文件?
- 14. 讀取大文本文件多線程?
- 15. php讀取大文本文件日誌
- 16. 讀取文本文件時不使用JS中的任何服務器
- 17. 從文本文件中讀取變量
- 18. 從文本文件中讀取向量
- 19. 從文本文件讀取變量
- 20. 批量/ vbs讀取文本文件
- 21. 使用argv讀取文本文件
- 22. Javascript:使用AJAX讀取文本文件
- 23. 使用OpenMP讀取文本文件
- 24. 使用matlab讀取文本文件
- 25. 使用Javascript讀取文本文件
- 26. 使用C++讀取文本文件
- 27. 使用SQL Server讀取文本文件
- 28. 使用Javascript讀取文本文件
- 29. 使用MPI-IO讀取文本文件?
- 30. 使用swift讀取文本文件
這將是IO綁定而不是計算綁定,並且使用多個線程不太可能加速它 - 實際上,使用多個線程訪問硬盤可能會減慢速度,因爲可憐的磁盤頭向後飛並轉發... –