2009-01-22 10 views
1

J'ai une application que j'ai créée pour copier des utilisateurs (10 000+) d'un domaine et créer l'utilisateur dans un autre domaine avec des propriétés personnalisées. L'application semble fonctionner correctement jusqu'à ce qu'elle atteigne 1,7 Go de mémoire, je sais qu'il y a une limite de 2 Go par processus sur les machines 32 bits mais je l'exécute sur une copie de Windows Server 2008 x64 avec 24 Go de RAM.Limites de mémoire

Mon application ne plante pas mais se termine avant (environ 3000 utilisateurs), peut-être la limitation de la mémoire n'est pas mon problème ici, mais c'était la première chose qui ressortait lorsque je comparais mon application à une application plus simple. utilisateurs en boucle.

J'ai mon projet défini sur "Any CPU" et il apparaît dans le gestionnaire de tâches sans le drapeau * 32.

Quelqu'un peut-il m'aider à comprendre ce qui se passe?

Merci

Répondre

2

Est-ce que toute structure de données unique dans votre programme dépasse 2 giga-octets? Le runtime .NET peut accéder à plus de 2 Go, mais aucun objet ne peut dépasser 2 Go. Par exemple, vous ne pouvez pas allouer un tableau d'octets supérieur à 2 Go.

Cela peut vous trébucher lors de l'utilisation des collections .NET. En particulier les types de collection Dictionary et HashSet génériques.

Obtenez-vous l'exception de mémoire insuffisante lorsque vous essayez d'ajouter quelque chose à une collection?

+0

Corrigez-moi également si je me trompe, mais .NET runtime non seulement ne peut pas allouer plus de 2 Go par objet, il doit également insérer un objet dans un bloc de mémoire continu, donc parfois même 2 Go être possible mais je ne suis pas totalement sûr à ce sujet. Jon Skeet pourrait nous éclairer :) –

+0

Vous avez raison. Vous aurez besoin d'un bloc de mémoire contigu, il est donc peu probable que vous obteniez près de 2 Go sur un système 32 bits. Il y a aussi des frais généraux d'allocation. Le plus grand octet que vous pouvez allouer, par exemple, est 2 147 483 591 octets. (Résultat expérimental.) –

0

La majeure partie de ma demande est mise en boucle par tous les utilisateurs en utilisant le 10000+ DirectorySearcher puis pour chaque DirectoryEntry trouvé que je crée un compte en utilisant les éléments suivants:

using(DirectoryEntry newUser = root.Children.Add("LDAPPATH")) 
{ 
     //Assign properties to the newUser 
     newUser.CommitChanges(); 
     //write the new username to a file using a streamwriter. 
} 

Je puis fermez le StreamWriter et rapport affiche le nombre de les utilisateurs qui ont été créés.

J'ai la taille de la page de DirectorySearcher définie à 110000 pour obtenir tous les résultats. Mon application se termine juste comme il devrait être seulement rapports 3500 utilisateurs créés. J'ai créé un test simple en utilisant le même code pour DirectorySearcher et au lieu de créer les comptes, je viens d'incrémenter un compteur, le compteur a atteint le nombre attendu, je pense qu'il doit s'agir de la création du compte ou de la journalisation dans le fichier .

0

Quelle est votre source pour les enregistrements? Pouvez-vous utiliser un modèle de type DataReader connecté plutôt qu'un modèle de type DataTable/DataSet déconnecté pour éviter de conserver plus de l'enregistrement en cours dans la mémoire?

Je doute que vous venez d'avoir un serveur avec 24 Go de RAM traînant ne faisant rien d'autre. Il doit avoir un travail à faire qui nécessite que la RAM soit disponible à cette fin. Juste parce que vous avez autant de RAM sur la machine ne signifie pas nécessairement qu'il est disponible, ou que c'est une bonne idée de s'en remettre.

+0

Très bon point ... –

+0

pas très bon point, car la question portait sur les limites de la mémoire. Il essaie de comprendre pourquoi sa mise en œuvre actuelle ne fonctionne pas. –

0

Que vous deviez ou non atteindre une limite, il me semble que vous tenez à des références à des objets dont vous n'avez pas vraiment besoin.

Si vous ne savez pas pourquoi vous consommez tellement de mémoire, vous pouvez essayer de profiler votre utilisation de la mémoire pour voir si vous avez vraiment besoin de toute cette mémoire. Il existe de nombreuses options, mais Microsoft CLR Profiler est gratuit et ferait ce dont vous avez besoin.

Questions connexes