我编写了一个脚本,使用单个线程和多个线程读取100mb +文本文件。多线程脚本共享相同的StreamReader,并在StreamReader.ReadLine()调用期间锁定它。在计算了我的两个脚本之后,它们的速度大致相同(似乎ReadLine()占用了大部分运行时间)。
我可以在哪下接下来呢?我正在考虑将源文件拆分成多个文本文件,这样每个线程都可以使用自己的StreamReader,但这看起来有点麻烦。有没有更好的方法来加快我的过程?
谢谢!
答案 0 :(得分:4)
使用单个硬盘,除了使用单个生产者(读取文件)多个消费者(用于处理)模型之外,您无能为力。硬盘需要移动机械“头部”以寻找下一个读取位置。执行此操作的多个线程只会反弹并且不会带来任何加速(更糟糕的是,在某些情况下可能会更慢)。
拆分输入文件更糟糕,因为现在文件块不再是连续的,需要进一步寻找。
因此,使用单个线程来读取大文件的块,并将任务放在同步队列中(例如ConcurrentQueue
)用于多个使用者线程,或使用QueueUserWorkItem
访问内置线程池。
答案 1 :(得分:0)
你可以在哪里接下来呢? 添加多个HDD,然后每个HDD有1个线程。在HDD上拆分文件。有点像RAID。
修改强> 这里曾多次提出类似的问题。只需使用1个线程读取文件,使用1个线程进行处理。不需要多线程。