Comment sérialiser les objets en .NET? (OutOfMemory Exceptions)
Je suis en utilisant la sérialisation pour "enregistrer" dans mon application. Mais lorsque les données sont trop grandes (15+ MO) je commence à avoir des OutOfMemory exceptions.
J'ai donc de nombreux objets et ils sont en relation avec d'autres petits objets, je crois que c'est à l'origine de trop de puissance de traitement et des données dans la mémoire.
Mon code est sur cette base, presque les mêmes:
http://www.codeproject.com/KB/vb/TreeViewDataAccess.aspx
Edit :
-
Je n'ai pas utiliser la sérialisation personnalisée, tout est fait par [Sérialisation] attributs. L'exclusion de certains champs.
-
Je sérialiser autant d'objets et de classes personnalisées. Comprend Dictionnaire, des structures et des tas d'autres trucs.
-
Je sérialiser dans un fichier.
-
- Je utiliser XmlSerializer
P. S. j'ai 4 GO de mémoire physique.
Solution
Merci pour les réponses, mon problème a été trouvé pour être avec XmlSerializer et j'ai de s'en débarrasser. La sérialisation binaire fonctionne très bien avec les données que j'ai.
- Ce type d'objet s'agit-il? Et ce que la sérialisation cadre utilisez-vous? Les données d'un arbre? ou un graphique? (c'est à dire il y a plus d'une voie à n'importe quel objet)?
- C'est tellement de nombreux objets liés, y compris beaucoup de classes personnalisées ainsi que d'un treeview 🙂
- Je ne suis pas à l'aide d'un cadre spécial à l'aide .NET de sérialisation (.NET Framework 2.0).
- mais sont-ils interconnectés... ceci a un impact...
- Bonne question, ils pourraient en fait. J'ai perdu le compte. N' .NET en double au lieu d'essayer de comprendre les liens?
- Qui dépend de l'autre question que j'avais posée: que la sérialisation cadre utilisez-vous? BinaryFormatter? XmlSerializer? DataContractSerializer? JSON? etc?
- Désolé, maintenant je vois. C'est BinaryFormatter
- Comment au sujet de l'affichage d'un exemple de votre code de sérialisation?
- J'ai regardé de nouveau et d'exception a été dans le XmlSerializer, j'ai utiliser les deux. première XmlSerializer pour Treeview normale serilization pour le reste.
Vous devez vous connecter pour publier un commentaire.
15MO ne devrait pas vous donner une OOM.
Si les données sont en forme d'arbre (plutôt que d'un graphe complet), vous pouvez envisager un sérialiseur comme protobuf-net; ainsi que l'utilisation de Google est très efficace (à la fois de la vitesse et de la mémoire) binaire "protocol buffer" format, il bénéficie de ne pas avoir à faire le suivi de référence (obligatoire pour les graphes) - ce qui signifie qu'il n'a qu'à s'inquiéter de données une fois (deux fois si il doit obtenir le tampon).
Cependant, cela nécessite différentes balisage de vos classes (ou au moins, un "opt-in") - et il ne gère pas les graphes complets. Mais il est là, et gratuit...
J'ai eu exactement le même problème. La raison en est que .NET
la sérialisation n'est pas à l'échelle.
J'ai résolu le problème en utilisant Simon Hewitt excellente ouvert
source de la bibliothèque, voir L'optimisation de la Sérialisation dans .NET - part
2.
D'ailleurs en réduisant considérablement l'utilisation de la mémoire, il est aussi beaucoup
plus rapide. Similaire à l'article que j'ai obtenu une vitesse de 20 fois.
En fait, XmlSerializer ignore la SerializableAttribute attributs. Ils sont utilisés uniquement par la mise en forme de classes (BinaryFormatter, SoapFormatter).
Je n'aurais pas sérialiser en utilisant le XmlSerializer, et surtout pas une combinaison de XmlSerializer et BinaryFormatter.
Je voudrais simplement essayer de sérialiser tout en utilisant le BinaryFormatter.
Vous pouvez écrire votre propre sérialisation des routines et voir si vous pouvez obtenir des avantages de performance à la main-d'adapter votre processus de sérialisation. Pour plus de détails, voir la Page MSDN sur la Sérialisation Personnalisée.
Peut-être vous pouvez nous donner un peu plus de détails sur la façon dont la sérialisation est faite. Utilisez-vous une sérialisation personnalisée ? Ou pensez-vous utiliser le haut-[Sérialisation] attribut ?
Je pense qu'une bonne façon pour vous de gérer cela est d'essayer de faire votre sérialisation personnalisée logique et ne sérialiser seulement ce dont vous avez besoin, il ne peut pas aller à 4 go, de toute façon il dépend aussi de combien de mémoire de votre demande a été attribué.
Avec toutes les approches qui sont mentionnés ici, la facilité de dumping gros objets sur le disque et de récupération est perdu. Aussi la prise en charge de ces seules données de vidage de types, de Sorte que vous ne pouvez pas dump types de référence, aussi facilement que vous pourriez avec BinaryFormatter.
Faire de la compression à l'aide de gzip ou 7-Zip avant binaire mise en forme des objets de grande taille en fait de déplacer la taille au-dessus de 16 MO à quelque chose comme 32 MO.
Vous pouvez Télécharger JSON.NET Bibliothèque qui fonctionne dans mon projet de plus de 100 MO de données de sérialisation et de désérialisation.
Pour la Sérialisation, vous pouvez travailler comme
Si vous avez l'utilisation des Objets TextWriter
Si vous avez de la chaîne d'utiliser StringWriter
Cela peut fonctionner pour vous.