使用多线程更快地读取文件?

时间:2012-02-16 15:30:02

标签: c# multithreading

我编写了一个脚本,使用单个线程和多个线程读取100mb +文本文件。多线程脚本共享相同的StreamReader,并在StreamReader.ReadLine()调用期间锁定它。在计算了我的两个脚本之后,它们的速度大致相同(似乎ReadLine()占用了大部分运行时间)。

我可以在哪下接下来呢?我正在考虑将源文件拆分成多个文本文件,这样每个线程都可以使用自己的StreamReader,但这看起来有点麻烦。有没有更好的方法来加快我的过程?

谢谢!

2 个答案:

答案 0 :(得分:4)

使用单个硬盘,除了使用单个生产者(读取文件)多个消费者(用于处理)模型之外,您无能为力。硬盘需要移动机械“头部”以寻找下一个读取位置。执行此操作的多个线程只会反弹并且不会带来任何加速(更糟糕的是,在某些情况下可能会更慢)。

拆分输入文件更糟糕,因为现在文件块不再是连续的,需要进一步寻找。

因此,使用单个线程来读取大文件的块,并将任务放在同步队列中(例如ConcurrentQueue)用于多个使用者线程,或使用QueueUserWorkItem访问内置线程池。

答案 1 :(得分:0)

你可以在哪里接下来呢? 添加多个HDD,然后每个HDD有1个线程。在HDD上拆分文件。有点像RAID。

修改 这里曾多次提出类似的问题。只需使用1个线程读取文件,使用1个线程进行处理。不需要多线程。