【发布时间】:2021-07-28 05:45:44
【问题描述】:
我正在用 C# 编写一个文件处理程序。我有一个巨大的文本文件,有 5 列数据,每列由一个条(|)分隔。每行的第一列是一个包含人名的列,每个人都有一个唯一的名字。
它是一个非常大的文本文件,所以我想使用多个任务同时处理它。但我希望 SAME 任务处理具有相同名称的每一行,而不是不同的任务。例如,如果(部分)我的文件内容为:
Jason|BMW|354|23|1/1/2000|1:03
Jason|BMW|354|23|1/1/2000|1:03
Jason|BMW|354|23|1/1/2000|1:03
Jason|Acura|354|23|1/1/2000|1:03
Jason|BMW|354|23|1/1/2000|1:03
Jason|BMW|354|23|1/1/2000|1:03
Jason|Hyundai|392|17|1/1/2000|1:06
Mike|Infiniti|335|18|8/24/2005|7:11
Mike|Infiniti|335|18|8/24/2005|7:11
Mike|Infiniti|335|18|8/24/2005|7:11
Mike|Dodge|335|18|8/24/2005|7:18
Mike|Infiniti|335|18|8/24/2005|7:11
Mike|Infiniti|335|18|8/24/2005|7:14
然后我想要一个任务处理 ALL Jason 行,另一个任务处理 ALL Mike 行。我不希望第一个任务处理任何 Mike 行,相反我不希望第二个任务处理任何 Jason 行。本质上,我怎样才能使某个名称的所有行都由 SAME 任务处理?另外,我怎么知道所有行的所有处理都已完成?我一直在绞尽脑汁,想不出解决办法。
【问题讨论】:
-
只需启动几个进程。将每个“名称”行发送到相应的进程。顺便说一句,您在这里需要多个进程的可能性极小。文件有多大?
-
文件是否按名称排序?
-
@AkshayNatu 什么是“巨大”?千兆字节?太字节?
-
@tymtam 基本上,认为线程是昂贵的,因为它们是,而且它们是有限的。如果每个唯一的人名都有一个专用线程,那么您就会用完。通过提出一种将名称映射到更小、有限的线程子集的方法,您可以避免过多的上下文切换和线程的过度使用。哈希或映射到更少线程的其他算法很可能会导致更好的吞吐量。散列是一种方法。您还可以使用“桶”或“分区”名称。例如,以“A-F”开头的每个人都去这里,而以“G-K”开头的每个人都去那里,依此类推。
-
@Kit 全部清除。您的解释让我意识到假设文件中没有很多不同的名称(这个假设很可能是错误的)。谢谢!
标签: c# multithreading file task-parallel-library