Recherche d'un fichier parmis plein d'autres : perfs catastrophiques

Recherche d'un fichier parmis plein d'autres : perfs catastrophiques - Java - Programmation

Marsh Posté le 11-04-2003 à 12:31:34    

Alors, voila la situation dans laquelle je suis :
Je cherche à trouver le nom exact d'un fichier, sachant :
- Je connais le répertoire dans lequel il est stocké
- Je connais les 8 premiers caractères du nom du fichier (il ne ma manque QUE l'extention)
- Dans ce répertoire se trouvent des dizaines de milliers d'autres fichiers
 
Dans cette situation, j'n'voyais qu'un truc à faire, ça :

Code :
  1. // Le filtre est une regexp
  2. String filter = "00000001" + "\\..*";
  3. // RegexFilnameFilter est un filtre utilisant des regexp que g écrit : ses perfs sotn très correct, il n'est pas fautif
  4. File[] files        = _fArcPath.listFiles (new RegexFilenameFilter (filter));
  5. arcFile = files[0];


 
Les perfs de ça sont pitoyables dans ma situation, tout simplement parce que, AVANT d'appliquer le filtre, "listFiles" récupère l'ensemble des noms de fichiers contenus dans le répertoire, et applique le filtre aux String (noms de fichiers) ainsi récupérés. Autant dire que niveau perfs, le filtre ne fait absolument rien gagner. Du coup je me retrouve avec des 15-20 secondes d'attente dans mon prog. Je précise qu'en C/C++ windows, la même chose prendre environ 0,10s (grrrr).
Vous n'avez jamais été confronté à ce pb ?
Vous verriez pas comment contourner ça par hasard !?

Reply

Marsh Posté le 11-04-2003 à 12:31:34   

Reply

Marsh Posté le 11-04-2003 à 12:38:12    

bin tu filtres rien du tout puisque tu commences par tout lire :o
 
Y a pas de solutions à ce genre de problème. Tu seras de toutes façons obligés de tout lire pour savoir si oui ou non le fichier correspond à ta regex


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 11-04-2003 à 13:44:34    

J'éspérais (sans trop y croie) qu'il existait une autre classe de l'API permettant de rechercher un fichier, et exploitant mieux les fonctions natives des OS. Parce qu'a mon avis, TOUS les OS permettent de faire ce que je cherche à faire. En tout cas, windows le permet : trouver un nom de fichier correspondant à un filtre snas énumérer tous les fichiers. Sinon, je vois pas comment ça pourrait se faire aussi rapidement en C.
Donc tu confirmes ce que pensais : le seul moyen que j'ai d'optimiser ça, c'est d'utiliser les fonctions natives de windows  ou autre OS) via JNI ?

Reply

Marsh Posté le 11-04-2003 à 14:42:08    

El_gringo a écrit :

Donc tu confirmes ce que pensais : le seul moyen que j'ai d'optimiser ça, c'est d'utiliser les fonctions natives de windows  ou autre OS) via JNI ?


 
bin je sais pas si ca va etre plus rapide par JNI mais je ne vois pas à priori de solutions à ton problème :/


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 11-04-2003 à 14:50:46    

DarkLord a écrit :


 
bin je sais pas si ca va etre plus rapide par JNI mais je ne vois pas à priori de solutions à ton problème :/


 
Ben si, pas JNI, c claire que ça ira 100 fois + vite. Au moins sous windows : Il existe une fonction de l'api windows qui permet de rechercher un fichier selon un masque, dans le même genre que listFiles, sauf qu'apparement, étant de + bas niveau, et vu les perfs, elle ne liste pas tout les fichiers d'un répertoire.
Par cette fonction, (FindFirstFile et FindNextFile pr les connaisseurs), ds les même conditions, on est 100 fois + rapide (100 fois réellement : 0.1s au lieu de 10s en Java !)

Reply

Marsh Posté le 11-04-2003 à 16:20:42    

Je trouve ça bizarre que ce soit aussi long.
 
Même avec autant de fichier... :??:

Reply

Marsh Posté le 11-04-2003 à 16:28:28    

MagicBuzz a écrit :

Je trouve ça bizarre que ce soit aussi long.
 
Même avec autant de fichier... :??:


 
bin non c normal -> accès disque. Et puis un listfiles ca récupère un array de File -> initialisé et tout hein :o


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 11-04-2003 à 16:56:34    

DarkLord a écrit :


 
bin non c normal -> accès disque. Et puis un listfiles ca récupère un array de File -> initialisé et tout hein :o


 
Ouais, enfin, c'est pas d'initialiser les File qui prend du temps dans mon cas, étant donné que je recherche un seul fichier, tous les autres sont filtrés par mon RexegFileNameFilter. Du coup une seule instance de File est construite. Ce qui est long, ce que la machine virtuelle est incapable de rechercher un fichier selon un filtre sans récupérér la liste de TOUS les ficheirs contenus dans un répertoire (ss forme d'un Array de String). Du coup, maintenant,  j'utilise une fonction système en C, via JNI, et j'ai biel et bien divisé par 100 le temps d'une opération (essentielle ds mon truc) :D sérieusement ! Un truc qui prenait 12-13 secondes en Java prend 0.1s en passant par la fonction système. ça vaut le coup !!!!!

Reply

Marsh Posté le 11-04-2003 à 16:58:42    

MagicBuzz a écrit :

Je trouve ça bizarre que ce soit aussi long.
 
Même avec autant de fichier... :??:


 
Ben, 5 000 fichier, via réseau en plus, j'avais oublié de préciser, ça se fait pas en 2 secondes! (enfin, en Java, parce qu'en C, ça se fait en 0.2 Secondes :D)

Reply

Marsh Posté le 11-04-2003 à 21:44:34    

mmmmm... vais faire un test, ça me semble chelou.
 
sinon, y'a pas une commande qui permette simplement de récupérer la liste des noms de fichiers (sans créer de pointeur sur les fichiers, ni lire une chiée d'infos inutiles, genre les dates de création, taille et cnie ?)

Reply

Marsh Posté le 11-04-2003 à 21:44:34   

Reply

Marsh Posté le 14-04-2003 à 09:12:49    

MagicBuzz a écrit :

mmmmm... vais faire un test, ça me semble chelou.
 
sinon, y'a pas une commande qui permette simplement de récupérer la liste des noms de fichiers (sans créer de pointeur sur les fichiers, ni lire une chiée d'infos inutiles, genre les dates de création, taille et cnie ?)


 
Mais il ne lit pas ces infos inutiles pour tous les fichiers du répertoire. Il récupère juste leur nom, puis applique le filtre à tous ces noms de fichiers, puis générère autant d'instances de File que de fichiers respaectant le filtre (un seul dans mon cas).
Voila. Alors, tes tests !?

Reply

Marsh Posté le 14-04-2003 à 20:18:08    

oublié de les faire :D

Reply

Marsh Posté le 15-04-2003 à 08:52:37    

MagicBuzz a écrit :

oublié de les faire :D


c pas trop tard!  :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed