Erreur outofmemory Serialize

Signaler
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Statut
Membre
Dernière intervention
30 janvier 2008
-
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Statut
Membre
Dernière intervention
30 janvier 2008
-
Bonjour,

Dans mon application serveur, lors de la sérialisation d'objets j'ai une erreur outofmemory. Apparemment ce là se produit lors de l'appel à la méthode Serialize.

ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, data);

data est de type object.

Normalement la mémoire est bien libérée puisque dans le finally je ferme bien mon MemoryStream :
finally
{
if (ms != null)
{
ms.Close();
ms = null;
}
}

Si vous avez une idée je suis prenneur...

<!-- / message -->

14 réponses

Messages postés
233
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
25 octobre 2010

Bonjour,

essaye de mettre un ms.Dispose() apres le close... parce que la tu ne libere pas ton objet, et si le garbage collector est un peu faineant (config par defaut) il ya fort a parier qu'il ne nettoye pas de suite ton objet...

Nul ne devient grand par la guerre...
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Si l'erreur est effectivement lévée lors de l'appel à Serialize, je ne vois pas en quoi le code qui suis dans le finally pourrait avoir un impact.

Tu dis que "data" est de type object, mais de quel genre de données s'agit il exactement? (quelle taille en particulier ? un constructeur par default avec du code spécifique ?)


Working as designed
www.nikoui.fr
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Statut
Membre
Dernière intervention
30 janvier 2008

Je bosse pour une boîte qui prend des commandes et je bosse sur leurs logiciels.
Les objets sont de type Client. 99% du temps la sérialisation se passe très bien et parfois on a un outofmemoty qui fait planter les services.


Mon constructeur est private dans une classe internal



internal



class
CacheManagerHelper



{



#region
Constructeur privé




///


<summary>








///
Empêche la classe d'être instanciée






///


</summary>






private
CacheManagerHelper(){

}



#endregion
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Statut
Membre
Dernière intervention
30 janvier 2008

ms.Dispose()
n'existe pas
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Statut
Membre
Dernière intervention
30 janvier 2008

framework 1.1
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Je pense que le problème viens de l'objet que tu sérialise, mais difficile de dire comme ça d'où pourrais venir le problème exactement... L'objet est il réellement volumineux ? As tu besoin de sérialiser toutes les propriétés de l'objet ? L'object en question contient-il d'autres objects volumineux (genre dataset) ? etc...


Working as designed
www.nikoui.fr
Messages postés
233
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
25 octobre 2010

j'avais pas fait gaffe que ms etait le flux, m'apprendra a faire ca entre deux au boulot...

sinon je suis de l'avis de Nikoui, ca viens de ce que tu mets dans le flux, t'as peut etre a un moment un data "plus volumineux" (genre un dataset remplis... ca, ca peut etre volumineux)

désolé d'avoir repondu trop vite...

Nul ne devient grand par la guerre...
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Statut
Membre
Dernière intervention
30 janvier 2008

En fait mon objet est un collection de clients. Cette collection une fois sérialisée peut faire entre 1 et 8Mo. on n'a jamais vu plus de 8Mo. (moins de 100 clients)
L'objet est relativement volumineux car nous embarquons beaucoup de données concernant les clients sur leurs anciennes commandes etc...
Pas de dataset.
Nous sommes obligés de sérialiser toutes les propriétés.
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Statut
Membre
Dernière intervention
30 janvier 2008

Sur un serveur on peut avoir au max une centaine de ces Collections sérialisées (1 par vendeur). En générale ils font entre 2 et 4Mo.
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Statut
Membre
Dernière intervention
30 janvier 2008

250 Mo au total sur un serveur (90 vendeurs) sachant que c'est un des serveurs où il y'a le plus de vendeurs.
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
250Mo c'est ce que tu envois en une fois ? Dans ce cas, essaye peut être de morceler et de sérialiser en plus petits paquets...


Working as designed
www.nikoui.fr
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Statut
Membre
Dernière intervention
30 janvier 2008

On fait fichier par fichier (environ 2 à 4Mo)
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Ca m'étonnes quand même que 4Mo pose problème... Y'a un truc quelque part :D (mais quoi, difficile a dire sans avoir le code sous la main)


Working as designed
www.nikoui.fr
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Statut
Membre
Dernière intervention
30 janvier 2008

Ouais j'ai l'impression que ça arrive au bout d'un certain nombre de sérialisation/déserialisations.
Si tu veux que je t'envoie du code donne-moi ton e-mail. J'ai une adresse msn aussi si tu voudras qu'on en parle.