Forum Programmation.autre Recherche optimisée dans un fichier

Posté par  .
Étiquettes : aucune
0
4
jan.
2006
Bonjour,

Je dispose d'un fichier de 70Mo contenant une liste de fichiers (log d'un backup)

-----------------------------------
/etc/host
/etc/passwd
...
-----------------------------------

Je dois rechercher rapidement (moins d'1s) dans ce fichier pour trouver si un fichier a bien été sauvegardé. Ca passe donc par la création d'un index et l'utilisation par la suite de cet index.

J'ai regardé le code source de locate, mais avant de réinventer la roue, je voudrais savoir si qqn ne connait pas un utilitaire léger permettant :
1° d'indexer mon fichier de log
2° de retrouver un fichier rapidement dans celui ci (à l'aide de regexp par exemple)


En gros ce que j'aimerais c'est une paire updatedb/locate pour le contenu de mon fichier.

Merci d'avance
  • # Une piste

    Posté par  . Évalué à 2.

    1° : Faire un script qui va balancer ton fichier dans une petite base de données, puis requete SQL pour retrouver le résultat

    Sinon, grep est trop long?
    • [^] # Re: Une piste

      Posté par  . Évalué à 1.

      Oui, grep prends environ 4 à 5s, ce qui me semble trop long pour une interface utilisateur (mais bon si je trouve que ça ....)
  • # meuh

    Posté par  (site web personnel) . Évalué à 2.

    tu peux éventuellement le faire par un simple script en te servant du fait que les tables de hachage utilisent.. des hachages, si tu peux disposer d'assez de mémoire :

    avec un fichier de 80M ça bouffe 60M de mémoire :

    [gc@meuh /tmp] perl -ne 'sub mem { open F, "/proc/self/status"; @foo = <F>; "@foo" =~ /VmRSS:(.*)/ and print "mem usage: $1\n"; }; BEGIN { mem() } chomp; $a{$_}++; END { mem(); print "number of files in index: ".int(keys %a)."\n"; while (<STDIN>) { chomp; print "was $_ present in file? -> "; print exists $a{$_}; print "\n"; } }' /tmp/log2

    mem usage: 1444 kB
    mem usage: 60444 kB
    number of files in index: 495353
    foo
    was foo present in file? ->
    /usr/bin
    was /usr/bin present in file? -> 1

    l'indexation prend environ 2,5 seconde, puis les réponses sont instantanées.
    • [^] # Re: meuh

      Posté par  . Évalué à 1.

      Le but du jeu serait de sérialiser la table de hachage pour éviter les 2,5 de sérialisation....

      comme je l'ai dis, le top du top serait un mécanisme à la locate/updatedb....
  • # re: Recherche optimisée dans un fichier

    Posté par  . Évalué à 2.

    Salut,

    Il y a une technique de recherche qui s'appelle la recherche dichotomique.
    Je ne sais pas si elle sera adaptée à ton problème car ton fichier semble gros,
    et deplus, il faut que le fichier de la recherche soit trié par noms par exemple.
    Mais si cela peut orienter tes recherches, voici quelques explications:

    http://www.chez.com/algor/dicho.htm
    http://serge.mehl.free.fr/anx/rech_dichotom.html


    a+
    Xavier

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.