我想使用读取文件的c#编写快速多线程程序。
所以文件必须拆分成一些部分,每个部分都在不同的线程中处理。例如:
Line1
Line2
Line3
Line4
必须分成4行:
Line1 => thread 1
Line2 => thread 2
Line3 => thread 3
Line4 = > thread 4
我使用StreamReader.readLine()
但它无法读取指定行。
注释:它有必要加速程序,所以我想在单独的线程中读取文件。
答案 0 :(得分:5)
除非你使用固定长度的线,否则这是不可能的。
为什么呢?因为为了确定“线”分割的位置,你需要找到换行符......这意味着你需要先读取文件。
现在,如果您只是想在之后执行一些额外的“处理”,那么您可以在每一行中阅读 - 使用ThreadPool
这是可能且相对简单的。
答案 1 :(得分:5)
你应该在单个线程中读取文件 - 然后将每行的处理产生到另一个线程,例如通过将其添加到生产者/消费者队列。
即使你可以寻找文本文件中的特定行(通常你不能),你真的不希望磁盘抖动 - 这只会减慢速度。从磁盘上获取数据的最快方法是按顺序读取数据。通过任何方式推迟处理“将二进制数据解码为文本”之外的行的
答案 2 :(得分:3)
AFAIK .NET不支持并行流读取。如果要处理每一行,可以使用File.ReadAllLines。它返回一个字符串数组。然后使用你可以使用PLINQ。
var result = File.ReadAllLine("path")
.AsParallel()
.Select(s => DoSthWithString(s))
.ToList();
答案 3 :(得分:2)
你无法加快实际阅读速度,因为你会遇到巨大的锁定问题,保持一切顺利。
由于文本文件是非结构化文件,即。每行可以有不同的长度,你别无选择,只能一个接一个地读取每一行。
现在,你可以做的是进程不同线程上的那些行,但是实际的读数,将它保存到一个线程。
但是,在你这样做之前,你确定你甚至必须这样做吗?这是瓶颈吗?如果没有,请先解决瓶颈,看看你能走多远。
答案 4 :(得分:1)
您的StreamReader已连接到流类。使用流类,您可以。查找特定的字节位置。
正如其他人所说,这可能不是一个好主意,但可以做到。
答案 5 :(得分:1)
我会事先拆分文件。说文件是1000行。将其拆分为10个100行文件。让一个线程处理每个文件。