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 :

(Ré)Allocation mémoire PERL


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut (Ré)Allocation mémoire PERL
    Bonjour à tous,

    Voilà, je vous explique le problème sur lequel j'ai déjà passé pas mal de temps sans trouver de solution possible, peut être pourrez-vous m'aider à avancer!

    J'ai réalisé un script qui est sencé tourner en continu sur un serveur de logs, qui analyse en continu les nouvelles lignes ajoutées au fichier de logs.

    Le principe de fonctionnement du script est de garder en mémoire certaines informations importantes, et de me faire un compte rendu toutes les heures, et de se supprimer la majorité des informations contenues en mémoire a chaque compte rendu qui m'est envoyé par mail.

    A chaque compte rendu envoyé, je supprime toutes les tables de hachage et toutes les références qui pourraient trainer. Et le problème arrive!

    En faisant un "top" sur le serveur, je vois par exemple le pourcentage mémoire utilisé qui monte jusque 10% en une heure, et lorsque qu'il me fait mon compte rendu et qu'il supprime les tables de hachage, le pourcentage mémoire utilisé stagne a 10%, et ne réalloue pas la mémoire utilisée par le script.

    Quelqu'un pourrait m'aider à réallouer cette mémoire, qui est réservée au script mais qui n'a plus aucune utilité pour celui-ci, afin que la mémoire soit à nouveau dispo pour le serveur?

    Merci aux courageux d'avoir lu mon roman jusqu'au bout, et j'éspère que vous aurez des idées!

    Tom

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    si ton script tourne en continu pourquoi stocké en memoire? pourquoi ne pas mettre ces infos dans un fichier temporaire que tu relit constamment!!!

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Perl a une politique : il ne rend jamais la mémoire qui lui est allouée.

    Cependant, au sein de son espace mémoire, il peut allouer et désalouer la mémoire des hashmaps, autrement dit si tu créées une hashmap qui fait 20 mo, que tu la supprimes en mémoire, et que tu la recrées, le process occupera toujours 20 mo.

    et, à moins d'avoir un 386 avec 8 mo de RAM, ce n'est pas un problème d'avoir 10% occupés en continu

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

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Merci pour vos réponses!

    Djibril , je ne sais pas si c'est faisable, je t'explique pourquoi:

    Les logs sur lesquels je travaille sont alimentés comme ce qui suit:

    blablabla(...) "identifiant_de_dialogue" blablabla(...) "valeur1=xxx" blablabla(...)
    blablabla(...) "identifiant_de_dialogue" blablabla(...) "valeur2=xxx" blablabla(...)
    blablabla(...) "identifiant_de_dialogue" blablabla(...) "valeur3=xxx" blablabla(...)
    blablabla(...) "identifiant_de_dialogue" blablabla(...) "valeur4=xxx" blablabla(...)

    Le problème est que j'ai besoin de ces 4 lignes absolument pour pouvoir faire mon traitement, et que ces lignes ne se suivent presque jamais.

    Pour pouvoir réaliser les statistiques dont j'ai besoin, je dois avoir "concatener" ces 4 lignes en une seule, je m'explique:

    je crée un tableau de hachage, dans lequel ma clé est l'"identifiant_de_dialogue" , et je stoque les 4 valeurs dans $hash{$identifiant_de_dialogue}[0] , $hash{$identifiant_de_dialogue}[1], $hash{$identifiant_de_dialogue}[2] et $hash{$identifiant_de_dialogue}[3].

    Je suis donc obligé (enfin je pense) de garder mon tableau de hachage en mémoire.

    Ensuite je recrée une deuxième table de hachage qui me permet d'exploiter ces données contenues dans ma %hash. Une fois le traitement effectué, la table hash ne m'est plus d'aucune utilité.

    MarneusCalgarXP, sais tu si on peut allouer un espace max a une table de hachage? Parce qu'en fait j'ai fait un test qui amenait l'occupation mémoire à 10%, mais j'avais effectué ce test à un moment ou il n'y avait pas beaucoup de traffique, j'ai peur qu'en pleine activité, j'explose mon taux d'occupation cpu de 10% à 100% très vite?

    Tom

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Au boulot, sur 4 de nos serveurs, on a des process perl qui utilisent 100% de la RAM en permanence, mais je te rassure, ca n'empêche en rien la machine de tourner de manière stable, et les autres process qui tournent en parallèle ne ressentent pas de pénalités particulières

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

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Si tu veux limiter la taille mémoire, la solution que je peux te proposer est de te tourner vers java, qui dispose d'un mécanisme de limitation de mémoire, alors que Perl n'en dispose pas à ma connaissance.

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

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Tout d'abord, merci pour tes conseils, mais je ne peux utiliser que PERL!

    Je pense avoir trouvé une solution, qui consisterai à utiliser un signal alarm(600) qui toutes les 10 min incrémente mes compteurs, et donc, au bout de ces 10 min, plus besoin de mes tables de hachages, que je peux dropper.

    Le seul problème qui me reste, est d'arriver à garder une deuxième table de hachage en mémoire (beaucoup plus petite!!!) alimentée à chaque signal d'alarme par l'autre table précédement droppée.

    Le problème c'est que pour l'instant, quand j'alimente dans ma fonction ma table %tri à partir de ma table %hash, et que je droppe la %hash en fin de fonction, je ne peux plus accéder à %tri, une fois que je "sors" de la fonction.

    Faut-il utiliser les "tie" de DBMopen etc... pour garder ma table %tri en mémoire?

    Ca avance!!! =)

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par tomtom59 Voir le message
    Le problème c'est que pour l'instant, quand j'alimente dans ma fonction ma table %tri à partir de ma table %hash, et que je droppe la %hash en fin de fonction, je ne peux plus accéder à %tri, une fois que je "sors" de la fonction.
    Il suffit de faire renvoyer %tri à la fonction.

    --
    Jedaï

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Merci à tous, ca fonctionne nikel!

    =>pas plus de 0.6% d'utilisation mémoire et la table %tri est accessible!!!

    très bon forum!

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

Discussions similaires

  1. Pb d'allocation mémoire malloc
    Par oz80 dans le forum C++
    Réponses: 5
    Dernier message: 18/11/2005, 17h23
  2. Limite Allocation Mémoire d'un tableau d'entier
    Par l9ft b9hind dans le forum C++
    Réponses: 5
    Dernier message: 27/10/2005, 19h29
  3. Allocation mémoire
    Par DestyNov@ dans le forum C++
    Réponses: 9
    Dernier message: 23/08/2005, 08h09
  4. [Pointeur] Allocation mémoire
    Par Rayek dans le forum Langage
    Réponses: 22
    Dernier message: 20/05/2005, 10h26
  5. Allocation mémoire dynamique
    Par ITISAR dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/01/2005, 09h59

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