4 votes

Calcul réparti en C#

J'ai une DLL spécifique contenant des classes et des méthodes de traitement de langage. L'une de ces méthodes reçoit un mot en argument et effectue un calcul d'environ 3 secondes et enregistre le résultat correspondant dans une base de données SQL-Server.

Je veux exécuter cette méthode DLL sur 900 000 mots et ce travail peut se répéter chaque semaine. Comment puis-je facilement distribuer ce travail sur plusieurs systèmes pour gagner du temps en utilisant c#?

17voto

Anuj Points 2658

Réponse sous forme : Exigence -- Outil

Exécutions planifiées -- Quartz.NET

Quartz vous permet d'exécuter des "jobs" selon un planning donné. Il maintient également l'état entre les exécutions, donc si pour une raison quelconque le serveur s'arrête, lorsqu'il redémarre, il sait qu'il doit commencer à exécuter le job. Vraiment cool.

File d'attente distribuée -- NServiceBus

Un bon ServiceBus vaut son pesant d'or. Fondamentalement, ce que vous voulez faire, c'est vous assurer que tous vos workers ne font qu'une seule opération pour autant d'opérations qu'il y a dans la file d'attente. Si vous assurez que vos opérations sont idempotentes, NServiceBus est un excellent moyen d'y parvenir.

File d'attente -> Worker1 += Worker 2 += Worker 3 --> Stockage de données local -> File de données + Workers -> Stockage de données distant

Cache de données -- RavenDb or SQLite

Fondamentalement, afin de garantir que les valeurs de retour des opérations données sont suffisamment isolées du serveur SQL, vous voulez vous assurer de mettre en cache la valeur quelque part dans un système de stockage local. Cela pourrait être quelque chose de rapide et non relationnel comme RavenDB ou quelque chose de structuré comme SQLite. Ensuite, vous envoyez un identifiant dans une autre file d'attente via NServiceBus et vous le synchronisez avec le serveur SQL, les files d'attente sont vos amies ! :-)

Opérations asynchrones -- Bibliothèque de tâches parallèles et TPL DataFlow

Essentiellement, vous voulez vous assurer que aucune de vos opérations ne bloque et qu'elles sont suffisamment atomiques. Si vous ne connaissez pas encore TPL, vous devriez, c'est vraiment puissant ! J'entends beaucoup cela de la part des gens venant de Java, mais cela vaut la peine de le mentionner... C# devient vraiment un excellent langage pour les workflows asynchrones et parallèles !

Aussi, une chose cool qui sort du nouveau CTP asynchrone est TPL DataFlow. Je ne l'ai pas utilisé, mais cela semble vraiment correspondre à ce que vous recherchez !

5voto

Henk Holterman Points 153608

Comme il s'agit d'un code existant, je chercherais un moyen de diviser cette liste de 900 000 mots.

Tout le reste nécessiterait beaucoup plus de modifications.

2voto

gjvdkamp Points 3441

Je pense que cela est traité avec Dryadlinq. Je n'ai que des connaissances à ce sujet, pas d'expérience pratique moi-même, mais cela semble correspondre à l'objectif.

GJ

2voto

Jesse Seger Points 477

Vous pourriez créer une application qui agisse comme un logiciel serveur. Il gérerait la liste des mots et les distribuerait aux clients. Votre logiciel client serait installé sur les PC distribués. Vous pourriez ensuite utiliser MSMQ pour une communication rapide et bidirectionnelle.

1voto

Organic Addict Points 101

Vous avez la bonne idée. Diviser pour mieux régner. C'est un travail typique pour le calcul parallèle distribué. Disons que vous avez cinq machines, chacune avec quatre cœurs, hyper-threadés. Cela vous donne 40 processeurs logiques.

Comme vous l'avez décrit, vous avez 750 heures de traitement à faire plus un peu de surcharge. Si vous pouvez diviser le travail sur 40 threads de traitement, vous pouvez tout faire en moins de 20 heures. Diviser le travail est la partie facile.

La partie difficile est de distribuer le travail et de l'exécuter en parallèle. Vous avez ici quelques choix comme d'autres l'ont souligné. Permettez-moi d'en ajouter quelques-uns à votre considération.

  1. Vous pourriez diviser manuellement la liste des mots par requête ou tout autre dispositif et lancer des applications console séparées et uniques sur chaque nœud/poste de travail qui utiliserait le TPL pour maximiser chaque processeur logique de chaque machine.

  2. Vous pourriez utiliser quelque chose MPAPI et coder vos propres nœuds et travailleurs.

  3. Vous pourriez installer Windows Server sur vos nœuds/postes de travail et exécuter Microsoft HPC et utiliser quelque chose comme MPI.NET pour lancer les travaux.

  4. Vous pourriez écrire une application console et utiliser DuoVia.MpiVisor pour distribuer et exécuter sur vos postes de travail. (Divulgation complète : Je suis l'auteur de MpiVisor)

Bonne chance à vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X