2010-03-30 4 views
2

Mon programme .NET doit exécuter un algorithme qui utilise intensivement les bibliothèques tierces (32 bits), dont la plupart sont du code non géré. Je veux conduire le CPU aussi fort que possible, de sorte que le code exécute plusieurs threads en parallèle pour répartir le travail.Recommandations pour IPC entre les processus parent et enfant dans .NET?

Je trouve que l'exécution simultanée de tous ces threads entraîne des pointes de mémoire temporaires, ce qui entraîne l'approche de la limite de 2 Go de la taille de la mémoire virtuelle du processus. Cette mémoire est relâchée assez rapidement, mais de temps en temps si assez de threads entrent les mauvaises sections de code à la fois, le processus croise la "ligne rouge" et le code non managé ou le code .NET rencontre une erreur de mémoire insuffisante. Je peux réduire le nombre de threads, mais mon utilisation du processeur n'est pas aussi élevée que je le voudrais. Je pense à créer des processus de travail plutôt que des threads de travail pour aider à éviter les erreurs de mémoire, car cela donnerait à chaque thread d'exécution ses propres 2 Go d'espace d'adressage virtuel (ma boîte a beaucoup de RAM). Je me demande quelles sont les meilleures/plus faciles méthodes pour communiquer l'entrée et la sortie entre les processus dans. NET?

Le système de fichiers est un choix évident. Je suis habitué à la mémoire partagée, aux tuyaux nommés, et à ceux de mon fond UNIX. Existe-t-il un mécanisme spécifique à Windows ou .NET que je devrais utiliser?

Répondre

0

Si vous utilisez WPF, de nombreuses formes courantes d'IPC sont disponibles. Cela peut être fait de telle manière que les modifications apportées au fichier de configuration sont tout ce qui est nécessaire, et laisse également la possibilité de communiquer entre les limites de la machine.

2

IPC dans .NET 3.0+ peut être effectué avec WCF et liaison de canaux nommés. L'avantage le plus évident est que vous pouvez répartir vos tâches lourdes sur les machines en changeant simplement la liaison. Plus sur ce here. En ce qui concerne l'empreinte mémoire, vous pouvez essayer d'obtenir vos bibliothèques tierces en 64 bits et exécuter vos tâches sur un système d'exploitation 64 bits pour obtenir plus de mémoire disponible pour votre processus.

+0

Avec un système d'exploitation 32 bits, vous pouvez également ajouter un autre gigaoctet de mémoire disponible pour l'application en utilisant le commutateur boot.ini/3GB en 2000/XP et IncreaseUserVa dans Vista/7. –

0

Oui, vous avez raison. Briser dans plusieurs processus, par opposition aux threads aidera, puisque chaque processus aura son propre espace virtuel de 2 Go (sur le système 32 bits). Comme vous avez beaucoup de RAM, une autre chose que vous pouvez faire (sans avoir besoin d'avoir plusieurs processus) est d'utiliser PAE (extension d'adresse physique) et votre processus peut traiter plus de 8 GB. Voir here

Comme d'autres l'ont suggéré, vous pouvez utiliser .NET Remoting (si le client et le serveur sont .NET, ils peuvent être locaux dans la même machine ou à distance). PS: cette réponse est en retard, peut-être votre exigence est terminée avec, mais je l'affiche ici pour une utilisation ultérieure de ce fil par d'autres personnes.

Questions connexes