在处理非常大的数据集时,Parallel.ForEach抛出异常
我的问题集中在一些以前没有失败的Parallel.ForEach代码上,现在我们的数据库已经增长到5倍大,几乎定期打破。在处理非常大的数据集时,Parallel.ForEach抛出异常
Parallel.ForEach<Stock_ListAllResult>(lbStockList.SelectedItems.Cast<Stock_ListAllResult>(), SelectedStock =>
{
ComputeTipDown(SelectedStock.Symbol);
});
的ComputeTipDown()方法获取所有的日常股票TIC数据的符号,并遍历每一天,获取昨天的数据,并做了一些计算,然后将它们插入到数据库中的每一天。
当公式更改时,我们很少使用它来重新计算静态数据值。
例外情况是这样的:
我们正在进入数据库具有RAM的16场演唱会,是双路四核,没有人再使用该系统,而我是重新计算。运行应用程序以重新生成代码的机器是一台带有12个超线程八进制内核的ram笔记本电脑。所以没有明显的资源争夺。
这是我对使用.NET 4和并行处理的尝试,所以我想知道是否有我丢失的东西。任何想法都会受到欢迎。
看起来您收到了AggregateException,这是Parallel.ForEach会在任何循环体方法引发异常时引发的。
如果你调试了这个,你应该可以看看InnerExceptions来查看抛出的实际异常。看起来ComputeTipDown
在一次或多次迭代中引发异常,导致发生这种情况。
Reed,非常感谢你的建议,我会在ComputeTipDown的捕获中放置一个断点,并会看到会发生什么。 – MikeMalter 2010-09-30 17:23:31
@MikeMalter:您也可以将Parallel.ForEach包装在try/catch中,并捕获AggregateException。这将给你在这一点上的细节...... – 2010-09-30 17:26:24
我通过单击您在答案中提供的AggregateException链接来阅读它。我刚刚得到另一个例外,这次是“真正的”。达到最大池大小。有趣。本周末我将服务器升级到2008 R2,SQL Server升级到2008 R2,并且在此之后,这种情况开始频繁发生。 – MikeMalter 2010-09-30 17:35:05
任何解决方案与完整的源代码? – Kiquenet 2012-08-22 19:54:25