Parallel.ForEach генерирует исключение при обработке очень больших наборов данных - PullRequest
1 голос
/ 30 сентября 2010

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

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

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

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

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

alt text

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

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

1 Ответ

1 голос
/ 30 сентября 2010

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

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

...