【问题标题】:How to process file line by line in multiple threads and one thread for each line in c# .net?c#.net中如何在多个线程中逐行处理文件,每行一个线程?
【发布时间】:2015-08-11 15:16:28
【问题描述】:

我创建了一个 c# WPF 项目,我必须处理一个包含一些记录的 csv 文件,这些记录可能不限于几百或几千或几百万。我需要读取记录行,然后处理通常需要 5 到 10 秒的记录,然后用新值更新记录。

该操作包括通过网络服务对服务器进行网络调用,然后服务器调用另一台服务器连接到权限服务器,权限服务器按照请求在同一循环中返回数据。该权限需要时间,因为它拥有一个非常大的数据库,其中包含大约十亿条记录。因此,加密解密和身份验证操作大约需要 5-10 秒才能完成。

我不能在一个线程中执行操作,因为处理整个文件可能需要几个月的时间,所以我想创建数百个线程来处理数据。我正在考虑的方法是,我正在尝试创建一个线程,该线程创建最多 100 个线程并监视它们是否有可用线程。当线程在处理后返回数据时,它会将其写入文件并创建新线程以供新行处理。

我认为的这种方法似乎太复杂了,我是否应该实施相同的方法以及我应该如何或如何解决问题。

【问题讨论】:

  • @YuvalItzchakov:我没有看到任何迹象表明 OP 受 OP 工作的约束。它正在处理需要 5-10 秒的记录,我们不知道该处理由什么组成。
  • @JonSkeet OP 认为在专用线程上读取每一行将有助于提高性能。
  • 处理包括什么?如果您受 CPU 限制,那么创建 100 多个线程可能不是一个好主意。如果您正在等待 Web 服务或类似的东西, 是否可以扩展到数百个并行请求?并行 LINQ 或 TPL 数据流在这里可能是合适的。
  • @YuvalItzchakov:不,OP 认为在专用线程上处理每一行将有助于提高性能,而且可能很好。
  • @JonSkeet 当然可以。但是 OPs 的问题太模糊了。

标签: c# .net wpf multithreading file


【解决方案1】:

这里有两个选项可以帮助您:

并行 LINQ 是更简单的选项,但提供的定制要少得多。它看起来像:

var results = File.ReadLines("input.csv")
                  .AsParallel()
                  .AsOrdered()
                  .WithDegreeOfParallelism(100)
                  .Select(ProcessLine);

File.WriteAllLines("output.csv", results);

(当然,你需要实现ProcessLine方法。)

现在这将为您提供很多并行性,但可能是通过很多时间阻塞的线程......而更复杂的解决方案最终会使用异步 IO,因此实际上您可能几乎不需要任何实际的线程

需要注意的一点:如果您通过网络发出 web 请求,您可能需要配置您可以向主机并行发出的最大请求数。请参阅 ServicePointManager.DefaultConnectionLimit<connectionManagement> 设置元素。

【讨论】:

  • 非常感谢。 @乔恩斯基特
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 2012-05-06
相关资源
最近更新 更多