IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

tie + MDBM + lecture données stockées


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de philobedo
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 80
    Par défaut tie + MDBM + lecture données stockées
    Bonjour,

    Je stocke un tableau de hash (sous forme hash de hash de hash...) dans un fichier avec tie, de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #!/usr/bin/perl -w
    use AnyDBM_File;
    use MLDBM;
    use Fcntl;
     
    tie %hIcsAfnor, 'MLDBM', 'stockExtract', O_CREAT|O_RDWR, 0640 or die $!;
     
    my $ics=0;
    foreach $_ (keys (%tabSsGroup)) {
    	$ics=$_;
    	my $retVal=&pkgICS::findIcs($fileSrc, $ics.".99");
    	if ($retVal) {
    		$hIcsAfnor{$ics}{$tabSsGroup{$ics}}{"sg99=1"}="";
    	}
    	else {
                 $hIcsAfnor{$ics}{$tabSsGroup{$ics}}{"sg99=0"}="";
    	}
    	$retVal=&pkgICS::findIcs($fileSrc, $ics.".01");
    	if ($retVal) {
                    my $libIcs=&pkgICS::findLibIcs($fileSrc, $ics.".01");
    		if ($libIcs ne 0) {
    	                $hIcsAfnor{$ics}{$tabSsGroup{$ics}}{"sg01=1"}=$libIcs;
    		}
    	}
    	else {
                 $hIcsAfnor{$ics}{$tabSsGroup{$ics}}{"sg01=0"}="";
    	}
    }
    untie(%hIcsAfnor);
    Apparemment tout se passe correctement, les sorties sont bonnes et j'obtient deux fichiers stockExtract.dir et stockExtract.pag...

    Le problème arrive quand je veux accéder à ces données stockées...
    Impossible! ou presque...en fait je n'accède que la première clé du premier tableau de hash mais pas les autres clés ni valeurs des autres tableaux de hash et je ne sais pas comment faire...
    Voici le code que je fais pour lire les données et qui ne m'affiche que la première clé...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #!/usr/bin/perl -w
    use MLDBM;
    use AnyDBM_File;
    use Fcntl;
     
    tie %hIcsAfnor, 'MLDBM', 'stockExtract', O_CREAT|O_RDWR, 0666 or die $!;
    while (($key,$val) = each %hIcsAfnor) {
    	print $key, "\n";
    	print $val, "\n";
    	while (($key1, $val1) = each %$val) {
    		print $key1, "\n";
    		print $val1, "\n";
    		while (($key2, $val2) = each %$val1) {
    			print $key2, ' = ', $val2, "\n";
    		}
    	}
    }
    untie(%hIcsAfnor);
    Je ne sais plus comment faire alors je me tourne vers vous pour une éventuelle solution, d'autant plus qu'il n'y a pas grand chose à ce sujet sur le forum, sur la perldoc et autre googlesearch...
    Merci d'avance de vos réponses.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    pour ce genre de truc utilise plutot DBM-Deep, qui fera du vrai multi niveau

  3. #3
    Membre éclairé Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Par défaut
    Moi j'ai des problèmes avec le partage de données entre processus ( fork() ), je suis entrain de scinder un script en deux pour gagner en vitesse de traitement le premier processus envoie les données via un tableau au second processus j'ai donc choisie de liée mon tableau par un tie() en utilisant DB_File seulement au bout d'un moment mon script de teste bogue, .


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #!/usr/bin/perl -w
    use strict;
    use diagnostics;
    use DB_File;
    use vars qw(@data);
     
    tie @data, 'DB_File', 'data.db', O_CREAT|O_RDWR, 0777, $DB_RECNO ;
     
    my $pid = fork();
     
    if ($pid != 0)
    {
      &affiche;
    }
     else
    {
      &affiche2;
    }
     
    sub affiche
    {
      my $m++;
      for (;;)
      {
         $m++;
         eval {
          push(@data, "Thread 1 say : $m");
         };
      }
    }
     
    sub affiche2
    {
       for (;;)
       {
         eval {
            if ( scalar @data > 0 )
            {
               my $e = shift @data;
               print "$e\n" if defined $e;;
            }
         };
       }
    }

    J'ai donc par la suite choisie de m'orienter vers un module ipc Win32::MMF::Shareable mais la encore meme problème sa plante



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #!/usr/bin/perl -w
    use strict;
    use diagnostics;
    use Win32::MMF::Shareable;
    use vars qw(@data);
     
    my $ns = tie @data, "Win32::MMF::Shareable", "array", {
      namespace => 'MyNamespace',
      size => 6096 * 6096,
      swapfile => 'private.swp'
    };
     
    my $pid = fork();
     
    if ($pid != 0)
    {
      &affiche;
    }
     else
    {
      &affiche2;
    }
     
    sub affiche
    {
      my $m++;
      for (;;)
      {
         $m++;
         eval {
          $ns->lock();
          push(@data, { 'mess' => "Thread 1 say : $m"} );
          $ns->unlock();
         };
      }
    }
     
     
     
     
     
    sub affiche2
    {
       for (;;)
       {
         eval {
            $ns->lock();
            if ( scalar @data > 0 )
            {
               my $e = shift @data;
               print "$e->{mess}\n" if defined $e;;
            }
            $ns->unlock();
         };
       }
    }

  4. #4
    Membre confirmé Avatar de philobedo
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 80
    Par défaut
    +1 pour DBM-Deep...
    Tout fonctionne correctement maintenant,
    En suivant les exemple de la doc perl j'ai enfin réussi à stocker mon imbrication de hash dans un fichier et d'accéder à ses résultats ultérieurement comme je veux !

    Merci pospos!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/02/2008, 16h01
  2. Réponses: 3
    Dernier message: 28/05/2007, 13h11
  3. Lecture données SQLServer à partir d'ACCESS
    Par fsicard dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/04/2007, 12h25
  4. [SQL-Server] Pb Lecture données PHP / SQL Server
    Par julienduprat dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 07/09/2006, 09h41
  5. Pb de lecture données dans une plage de cellule avec itération
    Par rond24 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/07/2006, 13h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo