使用多线程处理大量数据

时间:2011-03-17 05:04:27

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

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

我们使用NHibernate作为ORM。

一种方法是加载所有记录并按顺序处理它们......这可能会变得非常慢。 我正在研究多线程选项,并考虑让多个线程同时处理大量的记录。

任何人都可以给我一些关于如何处理这个问题的指示..考虑到我正在使用NHibernate以及可能出现的问题,比如死锁等等。

非常感谢。

4 个答案:

答案 0 :(得分:2)

您应该考虑Task Parallel Library

答案 1 :(得分:2)

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

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

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

  

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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