OVH Cloud OVH Cloud

Pattern et Hash

4 réponses
Avatar
pennguen
Bonjour,

J'ai un sou=E7i concernant une table de Hash et l'utilisation
(=E9ventuelle) de pattern.

Le probl=E8me auquel je suis confront=E9 est relativement simple. J'ai un
=E9norme fichier avec de multiples entr=E9es tagg=E9es par ID. J'utlise
donc un premier script d'indexation qui va me cr=E9er une table de hash
avec comme cl=E9 l'ID, et comme valeurs l'offset de l'entr=E9e, ainsi que
la longueur de l'entr=E9e.

hash{ID}{'d=E9but entr=E9e'}
hash{ID}{'longueur del'entr=E9e'}

J'utilise Storable.pm pour freezer ma table en dur.

Mon deuxi=E8me script utilise ce hash en dur, et la rapidit=E9 est quasi
instann=E9e.

L=E0, je dois bien avouer, je suis super content. Donc si je veux
l'entr=E9e correspondant =E0 l'ID 4528_AB, c'est tr=E8s rapide.

Mon sou=E7i, c'est si je veuxplusieurs entr=E9es... Je m'explique... Je
souhaiterais avoir toutes les entr=E9es XXXX_AB... Et l=E0, c'est chaud.

Deux solutions pour le moment... Boucler sur le hash :

if ($cle=3D~/_AB/){
push($cle,@bingo);
}

Bon, c'est tr=E8s lent.

La seconde :

my @bingo=3Dgrep ($_ =3D~ /_AB/,keys %hash);

L=E0 c'est plus rapide... mais c'est pas l'extase (mon hash est GROS).

Bref, mes questions...

1) y'aurait pas un truc existant style :

@bingo=3D$hash{/_AB/};

2) Connaissez vous une autre m=E9thode, m=EAme radicalement diff=E9rente,
mais plus rapide.

Merci...

4 réponses

Avatar
Emmanuel Florac
Le Tue, 27 Sep 2005 17:22:46 -0700, pennguen a écrit :


Mon souçi, c'est si je veuxplusieurs entrées... Je m'explique... Je
souhaiterais avoir toutes les entrées XXXX_AB... Et là, c'est chaud.


Si tes ID sont numériques, pourquoi ne pas utiliser un AoHoH?
hash[IDnum]{ID_alpha}

Comme ça tu peux utiliser une tranche de tableau :

@hash[2345-3542]->{ID_alpha}

--
Quidquid latine dictum sit, altum sonatur

Avatar
Jacques Caron
Salut,

On Wed, 28 Sep 2005 02:22:46 +0200, wrote:

my @bingo=grep ($_ =~ /_AB/,keys %hash);

Là c'est plus rapide... mais c'est pas l'extase (mon hash est GROS).
[...]

2) Connaissez vous une autre méthode, même radicalement différente,
mais plus rapide.


Si le format des clefs est bien connu et que tu sais quels types de clefs
t'intéressent (par exemple c'est toujours nnnn_XX et tu veux des séries
*_XX), tu peux découper d'avance en plusieurs niveaux de hash, par exemple
$hash{AB}{1234}. Dans ce cas tu pourras facilement récupérer toutes les
valeurs pour $hash{AB}...

Sinon tu peux voir du côté de dbm (perldoc -f dbmopen, perldoc
DB_File...), avec un B-Tree, à condition que tes recherches s'appuient sur
le *début* de ta clef. Si pour le moment c'est toujours la fin qui
t'intéresse, il suffit d'inverser, bien sûr.

Jacques.

Avatar
Srand
Pour rester dans le même esprit tu peux utiliser le module DBI (sympa
pour tester sqlite3), et créer une table à 2 colonnes. Ensuite tu
n'as plus qu'à effectuer un select avec une close like '%_AB%' pour
retrouver tes données. Tu peux aussi profiter de l'indexation dans ce
cas (selon la définition de ta table)
Avatar
pennguen
Merci a vous 3 pour vos explications...

Le format des clés n'étant pas connu, je vais tenter du DBI...
connais déjà, mais pas toutes ses subtilités. J'ai beaucoup à
apprendre. Je regarde également du côté des B-Tree... Ca me botte
bien, j'aime bien les arbres.. ;o)

Merci encore!