Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

"Compresser" les clés d'un hash

14 réponses
Avatar
JalaL
Bonjour a tous,

J'ai un serieux probleme avec un gros hash auquel je dois ajouter de
nouvelles valeurs pendant l'execution du programme.

Le hash est sous forme de %hash->{$url} = $url_id;

Pour le reduire, j'ai utilisé Digest::MD5. En encodant les URLs, parfois
trop longues, et parfois trop courtes en 32 characteres j'arrive a reduire
la taille totale (length) de toutes les clés à 1/3 de la taille originale
(sans md5). Ce qui est déjà une belle performance.

Inutile d'utiliser Compress::Zlib::memGzip parce qu'en plus de sa leuteur
elle augmente la taille totale des clés.

J'aimerai savoir s'il y a un autre moyen plus efficace et plus performant
que MD5 pour reduire la taille des clés tout en conservant la structure du
hash et des clés uniques.

4 réponses

1 2
Avatar
jl_morel
Dans l'article <45927ea9$0$8236$, a
dit...

J'ai un serieux probleme avec un gros hash auquel je dois ajouter de
nouvelles valeurs pendant l'execution du programme.

Le hash est sous forme de %hash->{$url} = $url_id;

Pour le reduire, j'ai utilisé Digest::MD5. En encodant les URLs, parfois
trop longues, et parfois trop courtes en 32 characteres j'arrive a reduire
la taille totale (length) de toutes les clés à 1/3 de la taille originale
(sans md5). Ce qui est déjà une belle performance.
[...]

J'aimerai savoir s'il y a un autre moyen plus efficace et plus performant
que MD5 pour reduire la taille des clés tout en conservant la structure du
hash et des clés uniques.



Si votre problème est uniquement celui de la taille du hash en mémoire,
vous pouvez utilisez le module DB_File qui permet (avec la fonction magique
tie) d'avoir un hash sur disque. Plus besoin de comprimer les clés, vous
n'êtes limité que par la taille de votre disque dur.
Voir :

http://perl.enstimac.fr/perl5.8.5/5.8.5/sun4-solaris/DB_File.html#db_hash

HTH

--
J-L.M.
http://www.bribes.org/perl

Avatar
JalaL
"Jean-Louis MOREL" a écrit dans le message de news:
4593ad47$0$17017$
Dans l'article <45927ea9$0$8236$,
a
dit...

J'ai un serieux probleme avec un gros hash auquel je dois ajouter de
nouvelles valeurs pendant l'execution du programme.

Le hash est sous forme de %hash->{$url} = $url_id;

Pour le reduire, j'ai utilisé Digest::MD5. En encodant les URLs, parfois
trop longues, et parfois trop courtes en 32 characteres j'arrive a reduire
la taille totale (length) de toutes les clés à 1/3 de la taille originale
(sans md5). Ce qui est déjà une belle performance.
[...]

J'aimerai savoir s'il y a un autre moyen plus efficace et plus performant
que MD5 pour reduire la taille des clés tout en conservant la structure du
hash et des clés uniques.



Si votre problème est uniquement celui de la taille du hash en mémoire,
vous pouvez utilisez le module DB_File qui permet (avec la fonction
magique
tie) d'avoir un hash sur disque. Plus besoin de comprimer les clés, vous
n'êtes limité que par la taille de votre disque dur.
Voir :

http://perl.enstimac.fr/perl5.8.5/5.8.5/sun4-solaris/DB_File.html#db_hash

HTH

--
J-L.M.
http://www.bribes.org/perl

Le gros soucis c'est que je voulais pas mettre ca sur base de données ou sur

fichier texte. Justement pour ne pas avoir plein d'acces disque pendant
l'execution et quand je dis plein c'est des dixaines de verifications par
seconde si telle ou telle url a deja été inserée dans la base de données.
Donc je garde tout en memoire pour n'acceder a la BDD que pour ecrire.

Je developpe un moteur de recherche, et le programme en question doit
extraire les URLs, faire un peu de nettoyage (session id, chemin absolu...),
indexer le texte avec calcul de pertinence c'est pour ca qu'il est un peu
bridé.

C'est vrai que le hash n'est pas la solution ideale, surtout qu'il doit
grandir sans arret. Un jour ou l'autre je vais devoir le mettre sur disque
dur ou bien utiliser directement la BDD.


Avatar
Jérémy JUST
Le Wed, 27 Dec 2006 15:09:46 +0100,

Le hash est sous forme de %hash->{$url} = $url_id;


Les URL ont naturellement une structure arborescente. Tu ne pourrais
pas en tirer parti pour stocker tes données dans un arbre plutôt qu'à
plat dans un hash?


--
Jérémy JUST

Avatar
JalaL
"Jérémy JUST" a écrit dans le message de news:

Le Wed, 27 Dec 2006 15:09:46 +0100,

Le hash est sous forme de %hash->{$url} = $url_id;


Les URL ont naturellement une structure arborescente. Tu ne pourrais
pas en tirer parti pour stocker tes données dans un arbre plutôt qu'à
plat dans un hash?


--
Jérémy JUST


Oui en effet, j'avais pensé a mettre
%hash->{$host}->{$path}->{$args} = $url_id

Je vais m'orienter plutot vers une solution utilisant le disque dur, ca va
etre ingerable avec toutes les urls que je compte indexer, plus de 60 000
url crawlée/jour avec 6 à 8 nouvelles url extraites de chaque page crawlée.


1 2