Lecture rapide d'un fichier volumineux [Résolu]

renyone 71 Messages postés vendredi 9 mars 2007Date d'inscription 12 avril 2010 Dernière intervention - 21 août 2008 à 14:48 - Dernière réponse : renyone 71 Messages postés vendredi 9 mars 2007Date d'inscription 12 avril 2010 Dernière intervention
- 25 août 2008 à 10:00
Bonjour.

Je vous expliquer mon problème: je veux lire un fichier (txt ou csv) qui fait 3 Go, parser chaque ligne et creer des objets en fontion des données que j'ai récupérées sur chaque ligne. Le problème est que c est super lent. Quand je regarde l'utilisation du processeur, je varie entre 0 et 4%. Mon fichier possede qd meme 14 millions de lignes...
Le problème vient-til de la lecture du fichier ?
Acutellement j utilise un Streamreader sr et pour chaque ligne je crée un string line = sr.ReadLine(). Puis je splitte ma line et je crée mes objets...

Merci d'avance pour vos réponse!
Afficher la suite 

21 réponses

Répondre au sujet
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 22 août 2008 à 18:01
+3
Utile
Donc le probleme ne viens pas de la lecture de ton gros fichier
Mais de l'insertion d'un grand nombre d'enregistrement indexé dans ton Btree

Ce qui ne m'etonne pas du tout !!

Tu dois donc jouer sur
- clef d'indexation
- L'information que tu stoque
- Le format de stockage

A ce niveau la ca devient le "vrai" metier de l'informaticien : etudier la solution la plus fonctionelle et la plus viable et contourner les multiples obstacles du monde reel !
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de olibara
renyone 71 Messages postés vendredi 9 mars 2007Date d'inscription 12 avril 2010 Dernière intervention - 21 août 2008 à 15:30
0
Utile
Personne n'a une idée ?
^^
Commenter la réponse de renyone
krishou 60 Messages postés dimanche 9 janvier 2005Date d'inscription 21 août 2008 Dernière intervention - 21 août 2008 à 16:18
0
Utile
Une mini optimisation qui ne changera probablement pas grand chose mais pourquoi créer un string a chaque boucle, pourquoi ne pas juste l'écraser ...;)
Commenter la réponse de krishou
renyone 71 Messages postés vendredi 9 mars 2007Date d'inscription 12 avril 2010 Dernière intervention - 21 août 2008 à 16:51
0
Utile
En fait, je comprends pas pourquoi mon UC ne monte qu'à 4% surtout...
Commenter la réponse de renyone
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 21 août 2008 à 20:53
0
Utile
Tu peux montrer ta boucle de lecture ?
Commenter la réponse de olibara
xmox667 357 Messages postés jeudi 8 juin 2006Date d'inscription 26 décembre 2011 Dernière intervention - 21 août 2008 à 21:14
0
Utile
Salut,
C'est un très gros fichier (pour un fichier txt) et les accès aux disque dur sont très lent.
Est ce tu as d'autres applications qui accèdent au disque en même temps que ton application?
Est ce que ton fichier est fragmenté?
A+
Commenter la réponse de xmox667
WishhhMaster 327 Messages postés mardi 17 février 2004Date d'inscription 10 avril 2010 Dernière intervention - 21 août 2008 à 22:54
0
Utile
Salut,

Si tu ne fais que lire le fichier, sans faire aucun traitement dessus, est ce que c'est toujours aussi lent, ou beaucoup moins?
Commenter la réponse de WishhhMaster
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 22 août 2008 à 07:39
0
Utile
tres bonne question !
Et regle fondamentale de debug
Chercher à isoler le traitement a problème !
Commenter la réponse de olibara
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 22 août 2008 à 07:51
0
Utile
Mais j'insiste un peu


Peux tu montrer le code de ta boucle de lecture ? Il y a souvent des trucs qu'on voit plus tellement on a l'habitude de les voir.


Sauf si c'est top secret bien sur !


 
Commenter la réponse de olibara
renyone 71 Messages postés vendredi 9 mars 2007Date d'inscription 12 avril 2010 Dernière intervention - 22 août 2008 à 11:40
0
Utile
Salut à tous et merci pour votre réponse.
Je fais les différents tests et reviens vers vous d'ici peu!

Merci encore ;)
Commenter la réponse de renyone
renyone 71 Messages postés vendredi 9 mars 2007Date d'inscription 12 avril 2010 Dernière intervention - 22 août 2008 à 13:38
0
Utile
Effectivement, quand je ne fais pas de traitement, c'est bien plus rapide et mon UC monte à 50%.
Le probleme vient d une méthode que j'utilise mais que je n'ai pas développé. J'utilise la méthode BTree.Put de l'api dotnet de Berkeley Db. Je ne sais pas si ça parle à quelqu'un... :)
Commenter la réponse de renyone
WishhhMaster 327 Messages postés mardi 17 février 2004Date d'inscription 10 avril 2010 Dernière intervention - 22 août 2008 à 14:02
0
Utile
Ca mets combien de temps pour lire le fichier par curiosité? Chez moi je mets 40 sec pour lire un fichier de 1 GO
Commenter la réponse de WishhhMaster
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 22 août 2008 à 14:45
0
Utile
Salut les 40 secondes de WishhhMaster sont une norme correcte, tu peux osciller entre 20 a 60 secondes a mon avis sur une machine "normale"

Attention ce n'est vrai que si tu ne lis ou ecris q'UN seul fichier a la fois

A mon avis meme si ta boucle reste to secret et que tu ne veux pas en parler, ce qui se passe c'est c'est que ton Btree.Put fais des IO paralleles qui parasittent tout

Exemple

Tu lis sequentiellement 1 fichier de 2GB temps : +/- 30 seconde
Tu lis DEUX fichier de 2GB sur le meme disque en synchro acces l'un acces l'autre etc

Temps : peut etre 20 minutes !!
Commenter la réponse de olibara
renyone 71 Messages postés vendredi 9 mars 2007Date d'inscription 12 avril 2010 Dernière intervention - 22 août 2008 à 14:54
0
Utile
Environ une minute pour 3 Go.
Commenter la réponse de renyone
WishhhMaster 327 Messages postés mardi 17 février 2004Date d'inscription 10 avril 2010 Dernière intervention - 22 août 2008 à 14:57
0
Utile
Donc oui c'est définitivement le traitement :)
Désolé je ne connais pas Berkeley db.
Bonne chance =)
Commenter la réponse de WishhhMaster
renyone 71 Messages postés vendredi 9 mars 2007Date d'inscription 12 avril 2010 Dernière intervention - 22 août 2008 à 15:00
0
Utile
Alors, non mon code n est pas du tout secret. En fait je lis dans mon fichier volumineux, je construis mes objets et je les serialize dans un autre fichier .db grace à la methode Put de la classe BTree de l'api DotNet de Berkeley Db.
Voici mon code :

while (line != null && line.Length > 0)
            {
                MarketDepth md = new MarketDepth();
               
                // DIVERS TRAITEMENT SUR LA LIGNE QUI NE CHANGE RIEN AU TEMPS D EXEC NI A L UTILISATION DU PROCESSEUR

                db.AddRecord(null, md);
                line = sr.ReadLine();
           
            }

Et AddRecord est sous cette forme:

public void AddRecord(Txn txn, MarketDepth value)
        {
            KeyForMarketDepth kfmd = new KeyForMarketDepth(value.Ric,
                                                           value.Date);
            DbEntry keyEntry  = _bdbFormatter.ToDbEntry<KeyForMarketDepth>(kfmd);
            DbEntry dataEntry = _bdbFormatter.ToDbEntry<MarketDepth>(value);
            WriteStatus status = _marketDepthDB.Put(txn, ref keyEntry, ref dataEntry, DbFile.WriteFlags.None);
           
        }

Si je commente la derniere ligne tout se passe bien. Par contre si je la laisse, l'utilisation de mon UC chute à 0-5% et la serialisation dans le fichier .db est super longue.

Merci encore
Commenter la réponse de renyone
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 22 août 2008 à 15:08
0
Utile
Salut

Tu veux donc dire que si tu ne fais PAS

            WriteStatus status = _marketDepthDB.Put(txn, ref keyEntry, ref dataEntry, DbFile.WriteFlags.None);

Tout va bien  ??

Donc d'apres moi et ce que j'ai dis un peu avant cela signifie que _marketDepthDB.Put fait des write su le dique qui bousculent tout

Ou se trouve cette DB ?
Peux tu essayer de mettre ton fichier a lire sur un AUTRE disque que celui de ta DB ?

Essaye, tu sera sans doute surpris !
Cela etant je supconne que _marketDepthDB.Put genere un Btree sur base d'une clef texte ce qui est aussi tres lent !! Mais comme ton CPU a l'air de bien se porter, essaye le coup du disque
Commenter la réponse de olibara
renyone 71 Messages postés vendredi 9 mars 2007Date d'inscription 12 avril 2010 Dernière intervention - 22 août 2008 à 15:33
0
Utile
Bon j'ai changé mon fichier à lire de DD, ca n a rien changé. J'ai meme créé un objet à la main (sans lecture de fichier) et je l utilise à chaque fois dans AddRecord (je fais une boucle 1000000 fois) et toujours la meme chose...
:'(
Commenter la réponse de renyone
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 22 août 2008 à 16:36
0
Utile
Salut

Tu veux dire quoi ?
Quand tu cree un objet a la main et que tu l'ajoute 100000 fois dans ta DB ca vas tres vite ?
Commenter la réponse de olibara
renyone 71 Messages postés vendredi 9 mars 2007Date d'inscription 12 avril 2010 Dernière intervention - 22 août 2008 à 17:12
0
Utile
Non non justement....
Commenter la réponse de renyone

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Lecture rapide d'un fichier volumineux - page 2