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 :

Consommation mémoire hallucinante avec glob()


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Consommation mémoire hallucinante avec glob()
    J'utilise la fonction glob() afin de lister un répertoire seulement cela consomme une quantité de mémoire qui fait froid dans le dos , dans la fonction principal de mon script j'appelle ma routine comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      print ">> Count Jobs\n";
      my $count = $self->_run_scanner('count');
     
      until ( $count > 0 )
      {
         $count = $self->_run_scanner('count');
      }
    le code avec glob


    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
    sub _run_scanner ($$)
    {
      my $self = shift;
      my $mode = shift;
     
      my @array = glob("$self->{Repository}[1]/*.task");
     
      if ( $mode eq 'count' )
      {
        return scalar @array;
      }
     
     
      my %data = map { $_ => undef } grep { $_ =~ s/$self->{Repository}[1]\/// } @array;
     
      foreach my $file ( keys %data )
      {
         unless ( -r "$self->{Repository}[1]/$file" and -w "$self->{Repository}[1]/$file")
         {
            delete $data{$file};
         }
      }
     
     
      return {} unless scalar keys %data > 0;
     
      foreach my $file ( keys %data )
      {
         open(FILE, "$self->{Repository}[1]/$file") or die 'Unable to read crawler repository';
         flock(FILE,2);
         binmode(FILE);
         local $/ = undef;
         my $content = <FILE>;
         flock(FILE,8);
         close(FILE);
         $data{$file} = Storable::thaw($content);
      }
     return \%data;
    }

  2. #2
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    erf, c'est le principe de Perl de consommer l'intégralité des ressources disponibles...

  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
    hein , voi la conso ram exploser juste en listant un répertoire tu trouve sa normal ?

  4. #4
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Tout dépend ce que tu entends par "exploser". Si c'est passer à 30mo de RAM consommée, oui c'est normal, si ca passe à 1Go, là un peu moins normal Mais il te reste la solution de faire appel à des commandes shell telles que find ou ls, moins consommatrices

  5. #5
    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
    Je suispas sous linux mais je peut lancer un ls depuis powershell reste plus qu'a trouvé comment faire sa proprement

  6. #6
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 899
    Par défaut
    Salut

    Je me permet d'intervenir.
    J'ai rapidement lu ton code. Donc tu veux lister un répertoire et récupérer des fichiers avec une certaine extension.
    Il y a peut être plus long à écrire mais moins coûteux en ressources que d'utiliser un glob :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    use strict;
     
    my $rep = "/home/gldavid/monrep";
    opendir DIR,$rep or die "$!\n";
    #Récupération des fichiers avec l'extension .task 
    my @files = grep { /\.task$/ } readdir(DIR);
    close DIR;
    while my $file (@files){
    my $absolute_namefile = $rep."/".$file;
    #Processing de chaque fichier
    }
    J'espère que cela t'aidera.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

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

Discussions similaires

  1. Consommation mémoire avec ImageIO.read
    Par Invité dans le forum Wicket
    Réponses: 4
    Dernier message: 18/04/2011, 11h23
  2. [TStringGrid] Consommation mémoire
    Par spender dans le forum Bases de données
    Réponses: 4
    Dernier message: 09/03/2006, 22h48
  3. [Consommation mémoire] Quoi utiliser pour trouver?
    Par doudine dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 25/01/2006, 14h50
  4. Réponses: 4
    Dernier message: 09/11/2005, 14h32
  5. Mémoire graphique avec StringGrid
    Par Jeanzeze dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/10/2005, 12h28

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