1

Ma question porte sur un code Parallel.ForEach qui fonctionnait sans cesse, et maintenant que notre base de données est 5 fois plus grande, elle se brise presque régulièrement.Parallel.ForEach lance une exception lors du traitement de très grands ensembles de données

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

La méthode ComputeTipDown() obtient tous les stocks de données quotidienne tic pour le symbole, et passer dans chaque jour, obtient les données d'hier et les met quelques calculs et insère ensuite dans la base de données pour chaque jour. Nous utilisons rarement ceci pour recalculer des valeurs de données statiques quand une formule change.

L'exception est la suivante:

alt text

La base de données que nous frappons a 16 Go de RAM et est un dual-core quad et personne utilisait le système alors que je RECALCUL. La machine qui exécute l'application pour régénérer le code est un ordinateur portable avec 12 Go de RAM avec un noyau octal hyper-threaded. Il n'y avait donc pas de conflit de ressources évident.

Ceci est mon incursion dans l'utilisation de .NET 4 et le traitement parallèle, donc je me demande s'il y a quelque chose qui me manque. Toutes les pensées seraient les bienvenues.

+0

toute solution avec le code source complet? – Kiquenet

Répondre

1

Cela ressemble à vous avez reçu un AggregateException, qui est ce que Parallel.ForEach déclenchera si l'une des méthodes de corps de boucle déclenche une exception.

Si vous déboguez ceci, vous devriez être en mesure de regarder le InnerExceptions pour voir les exceptions réelles levées. Il semble que ComputeTipDown ait déclenché une exception dans une ou plusieurs de vos itérations, ce qui a provoqué cette erreur.

+0

Reed, merci beaucoup pour la suggestion, je vais mettre un point d'arrêt dans le catch pour ComputeTipDown et verra ce qui se passe. – MikeMalter

+0

@MikeMalter: Vous pouvez également envelopper le Parallel.ForEach dans un try/catch, et attraper AggregateException. Cela vous donnera les détails à ce moment-là ... –

+0

J'ai lu cela en cliquant sur le lien AggregateException que vous avez fourni dans votre réponse. Je viens d'avoir une autre exception, et cette fois-ci c'était le "vrai". La taille maximale du pool a été atteinte. Intéressant. J'ai mis à jour le serveur ce week-end à 2008 r2 et SQL Server à 2008 R2, et c'était après que cela a commencé à se produire avec la fréquence régulière. – MikeMalter

Questions connexes