繁体   English   中英

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

[英]C# read text file lines multi thread

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

因此,必须将文件分为几个部分,并且每个部分都在不同的线程中处理。 例如:

Line1
Line2
Line3
Line4

必须分成4行,如下所示:

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

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

评论:它是加快程序速度的必要条件,所以我想在单独的线程中读取文件。

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

为什么? 因为要确定“行”在哪里拆分,您需要找到换行符...,这意味着您需要先阅读文件。

现在,如果您只想读完每一行执行一些额外的“处理”,则可以使用ThreadPool相对简单的操作。

您应该在单个线程中读取文件 -但是随后将每一行的处理生成到不同的线程,例如,将其添加到生产者/消费者队列中。

即使您可以查找文本文件中的特定行(通常不能这样做),您也确实不希望磁盘乱跳,这只会减慢速度。 从磁盘获取数据的最快方法是顺序读取数据。 通过一切手段推迟一切有关处理超越“解码二进制数据到文本”到其他线程行,但你真的不希望IO是在多线程。

AFAIK .NET不支持并行流读取。 如果要处理每一行,则可以使用File.ReadAllLines。 它返回一个字符串数组。 然后使用即可使用PLINQ。

var result = File.ReadAllLine("path")
   .AsParallel()
   .Select(s => DoSthWithString(s))
   .ToList();

您将无法加快实际阅读的速度,因为您将遇到巨大的锁定问题,无法保证所有内容的正确性。

由于文本文件是非结构化文件,即。 每行的长度可以不同,您别无选择,只能逐行阅读每一行。

现在,您可以做的是在不同线程上处理这些行,但是实际的读数将其保留在一个线程中。

但是,在您这样做之前,您确定甚至必须这样做吗? 这是瓶颈吗? 如果不是,请首先解决瓶颈,然后看多远。

您的StreamReader已连接到流类。 使用流类,您可以.eek到特定的字节位置。

就像其他人说的那样,这可能不是一个好主意,但是可以做到。

我会先拆分文件。 假设文件为1000行。 将其拆分为100行的10个文件。 有一个线程处理每个文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM