我正在逐行阅读大约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绑定而不是计算绑定,并且使用多个线程不太可能加速它 - 实际上,使用多个线程访问硬盘可能会减慢速度,因为可怜的磁盘头向后飞并转发... –