Serialisation + gros problème [Résolu]

Signaler
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
-
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
-
Salut à tous,



Mon problème est que j'ai une instance de la classe Donnees (qui contient une arraylist de personne) et qui s'apelle bdd.



Mon instance bdd comporte une ArrayList de 50 000 objets Personne.



Quand je serailise bdd avec 10 000 instance Personne ca met 13 sec à ecrire dans le fichier ( 1.7Mo)



pour 20 000 instances, ca met 1 min 25 et le fichier fait (3.4Mo)



pour 30 000 instances, j'ai pas vu la fin.....



Pour deserialiser ca va, ca prend 5sec, mais pour serialiser ( écrire
dans le fichier ) c'est horrible tellement c'est long. Le problème
c'est que mon appli devra pouvoir enregistrer au moins 200 000
personnes.



Je precise que bdd comporte une arraylist de Personne mais aussi
d'autre ArrayList moins grande (Société, Voiture...) ainsi que des
champs relatif à l'application (couleur de l'appli etc....)



Y'a t'il un moyen d'accelerer la serialisation ?? comment faire ???



Par avance, merci.

22 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
ok... dans ce cas, je ne passerai pas par la sérialisation "automatique" de .NET mais j'écrirai moi-même dans un BinaryStream tous mes objets... bien plus rapide puisqu'il n'y a pas de réflexion sur les objets.

Sébastien FERRAND
[MVP C#]
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
euh... utilise Access... au dela de 5000 items, le xml n'est pas une solution viable.

Sébastien FERRAND
[MVP C#]
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
Je fais de la serialisation binaire en faite : ca me sert a ce quand
l'utilisateur quitte son appli et la relance par la suite il retrouve
tout ses paramètre à l'identique.



//On
crée un nouveau Formatter




IFormatter
formatter = new BinaryFormatter();









//On
crée un flux vers fichier




Stream
stream = new FileStream("myExampleObject.bin",
FileMode.Create, FileAccess.Write, FileShare.None);









//On
sérialise




formatter.Serialize(stream,
myExampleObject);









//On
ferme le flux




stream.Close();
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
Dans l'exemple myExampleObject est une
classe serialisable qui contient une arraylist de 50 000 items en faite
plus d'autre truc aussi mais moins important en nombre
Messages postés
145
Date d'inscription
lundi 13 janvier 2003
Statut
Membre
Dernière intervention
27 décembre 2005
2
Non mais comme te l'ai dit Seb, oublie tout de suite le XML tu ne t'en

sortiras jamais !!!

Access a été conçu pour les bases de ton niveau jusqu'à plusieurs millions d'objet

donc saute dessus de toutes façons tu n'as pas le choix ...

La brigade meurt mais ne se rend pas (Hisoka)
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
mais j'utilise pas le xml........[javascript:Insert_Emoticon('/imgs2/smile_dead.gif'); ]
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
14
heu c moi ou j'ai rien compris au post la ???

pour finir tu utilise access ou tu veux juste stocker des donnees pour le design de ton appli en xml ou alors tes données dans du xml...


Arthenius
http://blogs.developpeur.org/Arthenius/

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
J'ai trouvé une question déja posé sur le forum et qui correspond exactement à mon problème, mais ca a pas été résolu....

J'ai pas ecris une seule fois le mot "xml", je sais pas pourquoi tout le monde croit que je veux faire du xml ou du access c'est pas pour utiliser un sgbd..



http://www.csharpfr.com/forum.v2.aspx?ID=265713
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
14
ben si coq seche t'est mal ...




<HR>
Arthenius
http://blogs.developpeur.org/Arthenius/

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
une question bête... pourquoi sérialiser

Sébastien FERRAND
[MVP C#]
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
Pour que quand je quitte mon programme, une instance de classe qui
represtente toutes mes données soit serialisé dans un fichier et que
quand je relance mon progarmme ce même fichier soit désérialisé et que
je recupere à l'identique cette instance, donc toutes mes données. Je
pense que c'est la meilleur solution mais y'a peut être mieux à faire.
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
ce que je ne comprends pas c'est que tout cela, tu l'as déjà dans ta base de données... et qu'il est surement plus rapide de refaire une requête qui rechargera l'ensemble de tes données.

surtout qu'entre le moment fermera son application et le moment où il l'a rouvrira, les données pourrons avoir changer.

Maintenant l'intérêt de charger 50.000 objets en mémoire

Sébastien FERRAND
[MVP C#]
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
Je suis pas connecté à une base de donnée, c'est juste que j'ai une
tableau de 150 000 personne en mémoire et qu'il faut que l'ecrive qq
part, en serialisant dans un fichier. J'ai pas le choix pour le nombre.
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
ce qui me dérange dans ton raisonnement c'est le chargement du tableau de 150.000 personnes...

je ne sais combien d'informations tu stockes par objet... mais ca risque de monter très vite en mémoire... t'imagine qu'en l'état, si tu as 500octets pour 1 personne tu vas te retrouver avec environ 75Mo de mémoire utilisée uniquement pour ton tableau !
plus biensur la mémoire allouée à ton programme... en moyenne 10Mo... etc.

C'est pourquoi, je te conseille depuis le début du thread de stocker tes données dans une base access.

Sébastien FERRAND
[MVP C#]
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
Ben c'est juste pour l'exemple imagine juste que j'ai un tableau de 150
000 personnes en mémoire et que je veux le sauver sur le disque pour le
récupérer sur le disque, c'est sur que je trouve pas ca logique non
plus mais c'est un cas d'école
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
et t'aurais pas un bout de code qui trainerais ?
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
pas sous la main... mais je vais essayer d'y pensé ce soir

Sébastien FERRAND
[MVP C#]
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
ok, merci, c'est sympa
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Là le problème ne vient pas du nombre d'éléments mais plutôt du contenu de la classe Personne.
Tu n'aurais pas une ou des Hashtables dedans ?

/*
coq
MVP Visual C#
*/
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
non non du tout, doit y avoir 20 propriétées differentes par contre.