【问题标题】:Parallel.ForEach throws exception when processing extremely large sets of dataParallel.ForEach 在处理非常大的数据集时抛出异常
【发布时间】:2010-09-30 16:46:20
【问题描述】:

我的问题集中在一些 Parallel.ForEach 代码上,这些代码过去可以正常工作,现在我们的数据库已经增长到原来的 5 倍,它几乎经常中断。

Parallel.ForEach<Stock_ListAllResult>( lbStockList.SelectedItems.Cast<Stock_ListAllResult>(), SelectedStock =>
{
    ComputeTipDown( SelectedStock.Symbol );
} );

ComputeTipDown() 方法获取该交易品种的所有每日股票 tic 数据,并遍历每一天,获取昨天的数据并进行一些计算,然后将它们插入每天的数据库中。

当公式发生变化时,我们很少使用它来重新计算静态数据值。

例外是这样的:

我们正在访问的数据库有 16 gigs 的 ram,并且是双四核的,在我重新计算时没有人使用该系统。运行应用程序以重新生成代码的机器是一台具有 12 gigs ram 和超线程八核内核的笔记本电脑。所以没有明显的资源争用。

这是我对使用 .NET 4 和并行处理的尝试,所以我想知道我是否缺少某些东西。欢迎任何想法。

【问题讨论】:

  • 有完整源代码的解决方案吗?

标签: sql-server multithreading parallel-processing linq-to-objects large-data-volumes


【解决方案1】:

您似乎收到了AggregateException,如果任何循环体方法引发异常,Parallel.ForEach 将引发此问题。

如果您对此进行调试,您应该能够查看InnerExceptions 以查看实际抛出的异常。看起来ComputeTipDown 在您的一次或多次迭代中引发了异常,导致这种情况发生。

【讨论】:

  • Reed,非常感谢你的建议,我会在 ComputeTipDown 的 catch 中设置一个断点,然后看看会发生什么。
  • @MikeMalter:您还可以将 Parallel.ForEach 包装在 try/catch 中,然后捕获 AggregateException。这将为您提供当时的详细信息...
  • 我通过单击您在答案中提供的 AggregateException 链接阅读了这一点。我刚刚遇到另一个例外,这次是“真正的”例外。已达到最大池大小。有趣的。我本周末将服务器升级到 2008 r2,将 SQL Server 升级到 2008 R2,然后就开始经常发生这种情况。
  • @MikeMalter:您是否将其作为 x64 进程运行?在 x86 中,默认的最大线程大小要小得多...
  • @MikeMalter:“ComputeTipDown”是否在内部使用数据库?如果是这样,您可能会达到最大数据库连接池。如果这是问题所在,您可能需要设置 ParallelOptions.MaxDegreeOfParalellism 并使用不同的 ForEach 重载:msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 2011-12-12
  • 2013-07-26
  • 1970-01-01
  • 2011-10-10
相关资源
最近更新 更多