Optimisation recherche dans un fichier XML

xtremejames183 Messages postés 32 Date d'inscription vendredi 26 mai 2006 Statut Membre Dernière intervention 14 avril 2009 - 14 juin 2007 à 14:49
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 21 juin 2007 à 15:02
Voila le topo :







static int
seek_xml_start(FILE  *fp)
{
  bool done = false;
  char a,b;
 
  if( fp == NULL) return -1;
 
rewind(fp); /* go to the start */
 
  while( done==false ) {
         
         for (;;)         if( (a (char)fgetc(fp)) '<' )
             break;          if ( (b (char)fgetc(fp)) '/' )
      {
          char tmp[5];
          short i;
          
          for ( i = 0; i < 4; i++ )
           tmp[i] = (char)fgetc(fp);
           
          tmp[4] = '\0';
#ifdef _WIN32
        
          if ( !_stricmp("Logs",tmp) ) /* we found where we need to start */
#else
          if ( !stricmp(("Logs",tmp) ) /* we found where we need to start */
#endif
          {
             done = true;
             fseek( fp, -7, SEEK_CUR ); /* go back */
          }
      }
   }

 return 0;
}


 
Cette fonction se deplace dans un ficheir XML ouvert a la recherche de </Logs> et postionne le pointeur du fichiers a l'aide de fseek mais voila si la taille du fichiers depasse les 100KO la recherche prend pas mal de temps et la c'est la cata surtout que cette applciation est destineés aux environements productifs alors je voudrais savoir si vous avez des solutions pour optimizer le code de la recherche.
A Vos Les Studios

6 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
14 juin 2007 à 16:24
Exemple mais en code Windows:
http://www.cppfrance.com/code.aspx?ID=19169

ciao...
BruNews, MVP VC++
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
14 juin 2007 à 18:26
Yop,

La source de BruNews est top il faut le dire, mais il lit les fichier Mo par Mo, hors un fichier xml ne dépasse que très rarement 1 mo, alors je pense que le fait d'allouer une variable de la taille du fichier n'est pas une tare :D . Pour ce qui est de la recherche de la balise, regarde ma cource http://www.cppfrance.com/code.aspx?ID=42940

elle recherche tout les balise de lien (http://deck-bsd.eurower.net]
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
14 juin 2007 à 18:27
Arf ouip ma source est codée pour win, mais le principe de la recherche est le mm.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
14 juin 2007 à 22:36
Gaffe que avec la xmlmania actuelle qui voudrait qu'on mette tout en xml, il y en a qui atteignent des tailles énormes.
ça ralentit tout mais bon... sont contents.

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xtremejames183 Messages postés 32 Date d'inscription vendredi 26 mai 2006 Statut Membre Dernière intervention 14 avril 2009
14 juin 2007 à 22:43
oue vous avez raison XML engloutis tout.
je cherche un code en ANSI-C
sinon je crois que je vais utiliser un parser genre EXPAT qui se positionne vers la fin de la balise </Logs> et renvoie la position.
Ya t'il une autre solution.
A Vos Les Studios
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
21 juin 2007 à 15:02
Salut,


Bah la tout de suite, j'ai la flemme et pas le temps de regarder les codes des liens ci-dessus... M'enfin je suppose que le principe global reste de parcourir des buffers en RAM + un algo pas stupide pour repérer efficacement les suites de caractères recherchée.

Si tu ne recherche que </Logs>, tu as pas franchement besoin d'un truc fantastique pour trouver la suite de caractère. Genre tu parcours caractère après caractère, et si tu tombe sur un <, tu regarde le troisième après (Car ça doit être courant les < dans du xml), puis une comparaison des autre.

Pour la mise en place d'un grosse portion de fichier en RAM, regarde ça.
0