2010-07-04 1 views
0

J'ai une application C# qui télécharge une liste de fichiers .xml à partir d'un entrepôt de données en ligne. Cette application saute les fichiers dans un répertoire local et cela prend environ 1 heure avant que tous les fichiers 10k aient été téléchargés. C'est un processus quotidien.Comment traiter les fichiers d'un répertoire à l'aide du multithreading C#

Je dois prendre chacun de ces fichiers et extraire, transformer et charger les données contenues dans une base de données. Je voudrais faire cela en parallèle avec le téléchargement car je ne veux pas attendre jusqu'à ce que tous les fichiers sont téléchargés avant de commencer le processus ETL. Malheureusement, les fichiers XML contiennent de grandes quantités de données, donc je peux ETL environ 10 fichiers à la fois. Quelle est la bonne stratégie pour atteindre mes exigences de chargement en parallèle?

+1

Quelles stratégies avez-vous mises au point jusqu'à présent? Quelles autres contraintes avez-vous? Quels fichiers de taille? Combien de données? Quel est votre processus ETL actuel? – Oded

+0

Les seules contraintes sont que je ne peux pas en avoir trop (car chaque fichier est chargé dans un DOM) les fichiers ont été chargés simultanément. Les fichiers sont ~ 2 Mo chacun. Il y a 10k fichiers. Le processus ELT consiste en un fichier .exe qui analyse le fichier XML et écrit les données analysées dans la base de données SQL Server. – Guazz

+0

Pas un dupe, mais cerainly connexes: http://stackoverflow.com/questions/3135237/ –

Répondre

0

Vous pouvez optimiser votre situation avec certains thread pools.

Ajoutez d'abord tous les fichiers à télécharger dans une file d'attente protégée par la synchronisation.

Vous auriez un pool de threads pour télécharger les fichiers, lorsqu'un fichier est sur le point d'être téléchargé, vous le retirez de la liste des fichiers à télécharger. Après avoir téléchargé le fichier, vous l'ajoutez à une autre file d'attente à traiter. S'il y a une erreur, vous pouvez l'ajouter à la file d'attente des fichiers à télécharger. Chaque thread se terminerait s'il n'y avait plus de fichiers à télécharger dans la file d'attente.

Alors que cela fonctionne, vous auriez un autre pool de threads pour traiter les fichiers XML réels, le pool de threads des travailleurs prendrait de cette file d'attente des fichiers XML déjà téléchargés. Chaque thread se terminerait s'il n'y a plus de fichiers XML téléchargés à traiter ET si l'autre pool de threads est déjà terminé.

Assurez-vous que vous prenez soin de considérations de synchronisation sur les files d'attente (par exemple: protéger avec un mutex pour l'insertion, la suppression, ...)

En utilisant des pools de threads vous pouvez définir le nombre de threads à utiliser sans affecter la logique du programme. Vous déterminez la meilleure valeur en fonction du nombre de ressources que vous souhaitez prendre et d'autres considérations telles qu'un trop grand nombre de pools d'unités d'exécution n'a aucun intérêt et ne concentrent que trop l'UC sur le changement de tâche.

0

Si cela est trop complexe pour vos besoins, vous pouvez regarder dans Parallel.ForEach/Parallel.For. En outre, la nouvelle classe Task (TaskFactory.StartNew (...)) et les suites (par exemple, le téléchargement se termine et passe à une fonction de traitement).

Questions connexes