1

. Мой вопрос сосредоточен на некотором коде Parallel.ForEach, который работал без сбоев, и теперь, когда наша база данных выросла в 5 раз больше, она ломается почти регулярно.Parallel.ForEach вызывает исключение при обработке чрезвычайно больших наборов данных.

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

Метод ComputeTipDown() получает все ежедневно акции тиков данных для символа, и итерации через каждый день, получает вчерашние данные и делает несколько вычислений, а затем вставляет их в базу данных для каждого дня.

Мы используем это редко, чтобы пересчитать статические значения данных при изменении формулы.

Исключение заключается в следующем:

alt text

В базе данных мы ударяя имеет 16 гигабайт оперативной памяти и двойной четырехъядерный, и никто не использовал систему в то время как я был перерасчета. Машина, запускающая приложение для восстановления кода, представляет собой ноутбук с 12 гигабайтами барана с восьмеричной восьмеричной резьбой. Таким образом, не было явного конфликта ресурсов.

Это мой набег на использование .NET 4 и параллельной обработки, поэтому мне интересно, есть ли что-то, чего я не вижу. Любые мысли будут приветствоваться.

+0

любое решение с полным исходным кодом? – Kiquenet

ответ

1

Это похоже на то, что вы получили AggregateException, что является тем, что Parallel.ForEach будет поднимать, если какой-либо из методов тела цикла вызывает исключение.

Если вы отлаживаете это, вы можете посмотреть на InnerExceptions, чтобы просмотреть фактические исключения. Похоже, что ComputeTipDown вызвало исключение из одной или нескольких ваших итераций, в результате чего это произошло.

+0

Рид, большое спасибо за предложение, я поставлю точку останова в catch для ComputeTipDown и увижу, что произойдет. – MikeMalter

+0

@MikeMalter: вы также можете обернуть Parallel.ForEach в try/catch и уловить AggregateException. Это даст вам подробную информацию в этот момент ... –

+0

Я прочитал, что, щелкнув ссылку AggregateException, указанную в вашем ответе. Я получил еще одно исключение, и на этот раз это был «настоящий». Максимальный размер пула был достигнут. Интересно. Я обновил сервер в эти выходные до 2008 года r2 и SQL Server до 2008 R2, и именно после этого это начало происходить с обычной частотой. – MikeMalter

Смежные вопросы