【问题标题】:Processing large amounts of data using multithreading使用多线程处理大量数据
【发布时间】:2011-07-17 03:27:35
【问题描述】:

我需要编写一个需要处理存储在数据库中的大量数据(100 000 条记录)的 c# 服务(可以是 Windows 服务或控制台应用程序)。 处理每条记录也是一个相当复杂的操作。作为处理的一部分,我需要执行大量插入和更新。

我们使用 NHibernate 作为 ORM。

一种方法是加载所有记录并按顺序处理它们……这可能会很慢。 我正在研究多线程选项,并正在考虑让多个线程同时处理记录块。

任何人都可以给我一些关于我应该如何处理这个问题的建议。考虑到我正在使用 NHibernate 以及像死锁等可能的陷阱是什么

非常感谢。

【问题讨论】:

  • 无关紧要的小问题——你的问题不是真正的“C#”问题,所以我可能会删除那个标签;并且由于您提到了 NHibernate 并且由于问题的性质,我可能会将其添加为标签。如果你想表达你在 .NET 中,请添加一个 .NET 标签。
  • 谢谢..点了:)
  • 您将处理过的数据存储在哪里? 100,000 条单独的更新语句将杀死您的数据库。
  • 任何带有完整源代码示例的解决方案?

标签: .net multithreading nhibernate large-data-volumes


【解决方案1】:

你应该考虑Task Parallel Library。

【讨论】:

    【解决方案2】:

    听起来 PLINQ 是最好的解决方案 (Chapter 5 in this article)。但是由于每个计算都与数据库一起工作,因此您应该为每个线程创建单独的会话。

    【讨论】:

      【解决方案3】:

      假设您使用的是 .NET 4.0,您可以使用任务并行库(如前所述)执行以下操作:

      Parallel.ForEach(sourceCollection, item => Process(item));
      

      您的源集合将是已加载记录的IEnumerable。图书馆将为您处理一切:

      源集合是分区的,工作是根据系统环境安排在多个线程上的。系统上的处理器越多,并行方法运行的速度就越快。

      阅读a tutorial on using Parallel.ForEach() 可能会有所帮助。另外,请注意potential pitfalls。

      【讨论】:

      • 感谢 Jon 和大家的建议。我只是在看任务并行库。我想知道如何在这里管理 NHibernate 会话,因为我无法控制并行线程。理想情况下,我希望每个并行线程都有自己的会话..关于如何使用 TPL 实现这一点有什么想法吗?
      【解决方案4】:

      尽可能使用 IStatelessSessions 并试验 adonet.batch_size 属性。

      还需要多高的性能?我是 NH 的粉丝,但这是存储过程可能更好的一种情况

      【讨论】:

      • 一如既往地需要高性能 :).. 但是我不太热衷于将所有业务逻辑移动到存储过程中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多