C#读取文本文件行多线程

时间:2011-10-19 20:06:36

标签: c# multithreading

我想使用读取文件的c#编写快速多线程程序。

所以文件必须拆分成一些部分,每个部分都在不同的线程中处理。例如:

Line1
Line2
Line3
Line4

必须分成4行:

Line1 => thread 1
Line2 => thread 2
Line3 => thread 3
Line4 = > thread 4

我使用StreamReader.readLine()但它无法读取指定行。

注释:它有必要加速程序,所以我想在单独的线程中读取文件。

6 个答案:

答案 0 :(得分:5)

除非你使用固定长度的线,否则这是不可能的。

为什么呢?因为为了确定“线”分割的位置,你需要找到换行符......这意味着你需要先读取文件。

现在,如果您只是想在之后执行一些额外的“处理”,那么您可以在每一行中阅读 - 使用ThreadPool这是可能且相对简单的。

答案 1 :(得分:5)

你应该在单个线程中读取文件 - 然后将每行的处理产生到另一个线程,例如通过将其添加到生产者/消费者队列。

即使你可以寻找文本文件中的特定行(通常你不能),你真的不希望磁盘抖动 - 这只会减慢速度。从磁盘上获取数据的最快方法是按顺序读取数据。通过任何方式推迟处理“将二进制数据解码为文本”之外的行的所有到其他线程,但你真的不希望IO在多个线程中。

答案 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行文件。让一个线程处理每个文件。