[英]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.