Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2680 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°358671
El_gringo
Posté le 11-04-2003 à 12:31:34  profilanswer
 

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 !?

mood
Publicité
Posté le 11-04-2003 à 12:31:34  profilanswer
 

n°358673
darklord
You're welcome
Posté le 11-04-2003 à 12:38:12  profilanswer
 

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
n°358720
El_gringo
Posté le 11-04-2003 à 13:44:34  profilanswer
 

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 ?

n°358828
darklord
You're welcome
Posté le 11-04-2003 à 14:42:08  profilanswer
 

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
n°358848
El_gringo
Posté le 11-04-2003 à 14:50:46  profilanswer
 

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 !)

n°359006
MagicBuzz
Posté le 11-04-2003 à 16:20:42  profilanswer
 

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

n°359019
darklord
You're welcome
Posté le 11-04-2003 à 16:28:28  profilanswer
 

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
n°359071
El_gringo
Posté le 11-04-2003 à 16:56:34  profilanswer
 

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 !!!!!

n°359075
El_gringo
Posté le 11-04-2003 à 16:58:42  profilanswer
 

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)

n°359295
MagicBuzz
Posté le 11-04-2003 à 21:44:34  profilanswer
 

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 ?)

mood
Publicité
Posté le 11-04-2003 à 21:44:34  profilanswer
 

n°360112
El_gringo
Posté le 14-04-2003 à 09:12:49  profilanswer
 

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 !?

n°360863
MagicBuzz
Posté le 14-04-2003 à 20:18:08  profilanswer
 

oublié de les faire :D

n°361142
El_gringo
Posté le 15-04-2003 à 08:52:37  profilanswer
 

MagicBuzz a écrit :

oublié de les faire :D


c pas trop tard!  :D


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
[C] récupérer un entier sur 2 octets dans un fichier [résolu]trouver le type de fichier avant l'envoi d'un upload
Comment copier un fichier indefiniment sur une même partition ?[php ou perl] petite bd dans 1 fichier
ecriture reecriture fichier en mode binairechemin vers perl automatique pour fichier exécutable
Ouverture d'un fichier Excel en Java ?code d'un moteur de recherche pour site internet
URGENT !! Recherche un fichier d'easyphp !!! 
Plus de sujets relatifs à : Recherche d'un fichier parmis plein d'autres : perfs catastrophiques


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR