OVH Cloud OVH Cloud

Structure pour un hachage d'un million d'entrées

6 réponses
Avatar
Charles Plessy
Bonjour,

Je voudrais faire un petit script, qui remplira un hachage d'un million
d'entrées. Je suppose que c'est beaucoup tros gros, et que je vais devoir
utiliser à la place une base de données.

Est-ce que perl propose un moyen de faire la chose plus simplement (voire,
est-ce que monter ma swap à 2 Go reglerait le problème) ?

--
Charles Plessy

6 réponses

Avatar
Laurent Wacrenier
Charles Plessy écrit:
Est-ce que perl propose un moyen de faire la chose plus simplement (voire,
est-ce que monter ma swap à 2 Go reglerait le problème) ?


Mettre le hash dans un DB_File sur disque est plus économique.

Avatar
Charles Plessy
Laurent Wacrenier wrote:

Charles Plessy écrit:
Est-ce que perl propose un moyen de faire la chose plus simplement
(voire, est-ce que monter ma swap à 2 Go reglerait le problème) ?


Mettre le hash dans un DB_File sur disque est plus économique.


Merci beaucoup, c'est exactement ce que je cherchais!

--
Charles


Avatar
dominix
Charles Plessy wrote:
Bonjour,

Je voudrais faire un petit script, qui remplira un hachage d'un
million d'entrées. Je suppose que c'est beaucoup tros gros, et que je
vais devoir utiliser à la place une base de données.

Est-ce que perl propose un moyen de faire la chose plus simplement
(voire, est-ce que monter ma swap à 2 Go reglerait le problème) ?


veuillez voir DBM::Deep !
l'est suppose faire ça.

--
dominix

Avatar
Charles Plessy
Laurent Wacrenier wrote:

Charles Plessy écrit:
Est-ce que perl propose un moyen de faire la chose plus simplement
(voire, est-ce que monter ma swap à 2 Go reglerait le problème) ?


Mettre le hash dans un DB_File sur disque est plus économique.


J'ai un problème, et je me demande si c'est lié à l'utisation de DB_File: Je
voudrais que mon hachage contienne des tableaux anonymes, or le script
ci-dessous me donne l'erreur suivante :

Can't use string ("ARRAY(0x81d896c)") as an ARRAY ref while "strict refs"

Dois-je en conclure que la référence est changée en banale chaîne de
caractères? (et que le contenu du tableau anonyme n'est pas stocké?

Dois-je changer le tableau en concaténation de chaînes (ce qui ne poserait
pas trop de problèmes...) ?

--
Charles






use strict;
use DB_File;

my $file = shift;
our %h;
tie %h, "DB_File", $file;

my $seq = 'TCTTACTACTATATCCTCCATATCCTATATACTAT';
my $seq_name = 'toto';
my $oligo_length = "5";

while ($seq =~ /(.{$oligo_length})/ ) { # on va déplacer une fenêtre
$h{$1} = [] unless $h{$1} ; # Il faut un tableau anonyme
my $refarray = $h{$1}; # on récupère la référence
push (@$refarray, $seq_name); # on ajoute un élément
$seq =~ s/.//; # Raccourcit la séquence
}

untie %h;


Avatar
Charles Plessy
Charles Plessy wrote:

Laurent Wacrenier wrote:

Charles Plessy écrit:
Est-ce que perl propose un moyen de faire la chose plus simplement
(voire, est-ce que monter ma swap à 2 Go reglerait le problème) ?


Mettre le hash dans un DB_File sur disque est plus économique.


J'ai un problème, et je me demande si c'est lié à l'utisation de DB_File:
Je voudrais que mon hachage contienne des tableaux anonymes, or le script
ci-dessous me donne l'erreur suivante :

Can't use string ("ARRAY(0x81d896c)") as an ARRAY ref while "strict refs"

Dois-je en conclure que la référence est changée en banale chaîne de
caractères? (et que le contenu du tableau anonyme n'est pas stocké?

Dois-je changer le tableau en concaténation de chaînes (ce qui ne poserait
pas trop de problèmes...) ?



Je me réponds à moi-même, car je viens de trouver la réponse dans "Perl DBI,
le guide du développeur" (O'Reilly).

On ne peut effectivement pas stocker de telles structures de manière
transparente dans une base de données Berkeley.

--
Charles



Avatar
Paul GABORIT
À (at) Fri, 27 Feb 2004 18:05:46 +0100,
Charles Plessy écrivait (wrote):
J'ai un problème, et je me demande si c'est lié à l'utisation de DB_File: Je
voudrais que mon hachage contienne des tableaux anonymes, or le script
ci-dessous me donne l'erreur suivante :

Can't use string ("ARRAY(0x81d896c)") as an ARRAY ref while "strict refs"

Dois-je en conclure que la référence est changée en banale chaîne de
caractères? (et que le contenu du tableau anonyme n'est pas stocké?


Utilisez MLDBM. C'est un module qui se charge de sérialiser les données liées
à chacune des clés de votre table de hachage avant d'utiliser le module de
stockage (DB_File dans votre cas).

use MLDBM qw(DB_File Storable);

Cela vous oblige à passer par une TIEHASH mais comme vous le faisiez
déjà... tout va bien ;-)

Les données à sérialiser peuvent être un tableau anomyme ou n'importe quelle
autre structure plus ou moins complexe. Mais elles ne doivent pas contener de
closure (des sub anonymes). Une autre limitiation à noter porte sur les
références vers une même donnée qui apparaitraient dans plusieurs
valeurs. Cette donnée sera dupliquée lors de la relecture.

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>