我有一个非常繁重的数字运算过程,它汇集来自3个不同数据库的大型数据集,然后对每个数据库进行一些处理,最终产生结果。 如果它仅由单个资产使用,则此过程很好。但是我现在有3500个资产需要处理,在当前流程的状态下大约需要1小时30分钟。
在多线程c#应用程序方面,加速此过程的最佳选择是什么?实际上,我不必在处理每个资产之间共享任何内容,因此我有信心能够一次运行多个资产,不应该导致太多问题。
我听说过关于线程池的好东西,但我想实际上我想要的东西不是太大而无法实现,很容易理解,并且可以一次运行大量线程。
非常感谢帮助。
答案 0 :(得分:2)
如果您没有多核处理器,多台机器和/或线程进程不受I / O限制,多线程将无济于事。首先分析当前的处理过程,看看时间的去向。
线程池很好,您可以使用任务队列进行简单的负载平衡,但如果当前应用程序中没有备用CPU周期,这将浪费时间。
答案 1 :(得分:2)
在.net中,您可以使用现有的线程池,无需自己实现。这是相关的MSDN。
你应该注意不要一次运行太多的进程(3500有点多),但使用提供的排队机制应该让你开始正确的方向。
要尝试的另一件事是使用PLINQ。
答案 2 :(得分:1)
最好的选择是使用.NET 4中的新任务并行库,如果可以使用VS 2010 RC执行此操作。这有内置的负载平衡和工作窃取队列,因此它将使这个任务易于线程化,并且非常可扩展。
但是,如果你需要在.NET 3.5中执行此操作,我建议使用ThreadPool,并使用ThreadPool.QueueUserWorkItem来启动每个任务。
如果您的任务在整个生命周期中都是计算密集型的,那么您可能希望防止同时运行太多。在这种情况下,某种形式的队列(从中拉取工作并执行)可能是有益的。只需将所有工作项放入队列中,让线程从队列中拉出工作(通过适当的锁定),然后进行处理。
如果您有一个多核系统,并且CPU周期是您的瓶颈,那么这应该可以很好地扩展。
答案 3 :(得分:1)
内置ThreadPool的.Net将解决您运行大量线程以及易于使用的两个要求。我之前写了一篇关于这个主题的文章,你可以找到here。
答案 4 :(得分:0)
使用SQL Server 2005或更高版本,您可以在C#中创建用户定义的函数,并在T-SQL过程中使用它们,这可以为数字运算提供明显的加速。 SQL Server是多线程的,并且可以很好地使用它,因此请考虑尽可能多地保留数据库引擎中的处理。