Question

J'utilise sérialisation pour « sauvegarde » dans ma demande. Mais lorsque les données sont trop gros (15+ MB) Je commence à faire des exceptions OutOfMemory.

J'ai tant d'objets et ils sont connectés avec d'autres petits objets, je pense que cela provoque trop de puissance de traitement et les données contenues dans la mémoire.

Mon code est basé sur ce, presque même:

http://www.codeproject.com/KB/vb/TreeViewDataAccess.aspx

Modifier

  1. Je ne me sérialisation personnalisé, tout cela se fait par [sérialisation] attributs. Hors certains champs.

  2. Je sérialiser tant d'objets et des classes personnalisées. Comprend dictionnaire, des structures et des tas d'autres choses.

  3. Je sérialiser dans un fichier.

  4. J'utilise XmlSerializer

P.S. J'ai 4 Go de mémoire physique.

Solution

Merci des réponses, mon problème a été trouvé pour être avec XmlSerializer et j'ai débarrasser. sérialisation binaire fonctionne très bien avec les données que j'ai.

Était-ce utile?

La solution

15Mo ne devrait pas vous donner un OOM.

Si les données arborescente (plutôt que d'un graphe complet), vous pourriez envisager un sérialiseur comme protobuf-net; ainsi que l'utilisation de Google très efficace (à la fois la vitesse et la mémoire) format « tampons de protocole » binaires, il bénéficie de ne pas avoir à faire le suivi de référence (requis pour les graphiques) - ce qui signifie qu'il n'a qu'à se soucier de données une fois (deux fois si elle a pour obtenir en mémoire tampon).

Cependant, cela nécessite différentes balises à vos classes (ou au moins, un « opt-in ») - et il ne traitera pas des graphiques complets. Mais il est là, et gratuit ...

Autres conseils

J'ai eu exactement le même problème. La raison en est que .NET sérialisation n'échelle.

J'ai résolu le problème en utilisant une excellente ouverture de Simon Hewitt bibliothèque source, voir Optimisation sérialisation dans .NET - partie 2 .

En plus de réduire considérablement l'utilisation de la mémoire, il est aussi beaucoup plus rapide. Semblable à l'article, je suis une vitesse d'20 fois.

En fait, XmlSerializer ignore les attributs SerializableAttribute. Ils sont utilisés que par les classes de formatage (BinaryFormatter, SoapFormatter).

Je ne sérialisation en utilisant le XmlSerializer, et surtout pas une combinaison de XmlSerializer et BinaryFormatter.

Je voudrais essayer simplement de sérialisation tout en utilisant BinaryFormatter.

Vous pouvez écrire vos propres routines de sérialisation et de voir si vous pouvez gagner des avantages de performance en main adapter votre processus de sérialisation. Pour plus de détails, consultez la la page MSDN sur mesure sérialisation .

Peut-être que vous pouvez nous donner un peu plus de détails sur la façon dont la sérialisation est fait. Utilisez-vous une sérialisation personnalisée? Ou est-ce que vous venez d'utiliser l'attribut intégré [sérialisation]?

Je pense qu'un bon pour vous façon de gérer cela est d'essayer de faire votre logique de sérialisation personnalisé et seulement sérialisation seulement ce dont vous avez besoin, il ne peut pas aller à 4 Go, de toute façon, il dépend aussi de combien memeory votre application a attribué.

Avec toutes les approches qui sont mentionnées ici, la facilité de dumping de gros objets sur le disque et la récupération est perdue. Également un soutien Exporte uniquement les types de données, vous ne pouvez pas vider les types de référence aussi facilement que vous pouvez faire avec BinaryFormatter.

faire également la compression en utilisant gzip ou 7-Zip avant la mise en forme binaire de grands objets se déplacent effectivement la taille au-dessus de 16 Mo à quelque chose comme 32 MB.

Vous pouvez télécharger JSON.NET Bibliothèque qui fonctionne dans mon projet plus 100 Mo de sérialisation de données et désérialisation.

Pour sérialisation, vous pouvez travailler comme

Si vous avez utilisé l'objet TextWriter

using (TextWriter textWriter = File.CreateText("LocalJsonFile.json"))
{
    var serializer = new JsonSerializer();
    serializer.Serialize(textWriter , yourObject);
}

Si vous avez la chaîne utilisation StringWriter

  StringBuilder sb = new StringBuilder();
  StringWriter sw = new StringWriter(sb);

  using(JsonWriter textWriter = new JsonTextWriter(sw))
  {
     var serializer = new JsonSerializer();
     serializer.Serialize(textWriter, yourObject);
  }

Cela peut fonctionner pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top