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 :

optimisation, mémoire, et objets


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut optimisation, mémoire, et objets
    bonjour,
    je vais essayer d'être clair même si ça va m'être difficile.
    j'utilise moose.
    j'ai des instances de classe qui ont besoin chacune de données les concernant qu'elle doivent puiser dans plusieurs gros fichiers texte. d'environ 400 000 lignes pour le plus gros pour le moment. le choix du fichier texte plutôt que la bases de donnée est personnel.
    La première solution était que chaque instance parcourt le fichier avec fopen pour puiser ses ressources.
    Puis ... j'ai vu la très
    de Lolo (si j'ai bien compris) à laquelle je n'ai pas compris grand chose pour le fond, mais m'a fait penser (j'aurais peut être pas du)
    j'ai donc tenté de créer une fabrique d'instances de classe qui allait chercher le gros fichier une fois pour toute et qui allait implanté dans chaque instance les lignes qui la concernait...
    Deux choses
    la première c'est que je me suis rendu compte que ça ne pouvait fonctionner qu'avec certains type de besoins ( de données) , car d'autres besoins ne pouvaient être connus à l'instanciation de la classe.
    la seconde c'est que que la vitesse d'exécution était sensiblement la même dans les deux cas à vue de nez. Un fopen depuis la fabrique pour remplir un tableau ce qui fait un premier parcours des données, un premier tri et donc un autre parcours des données aux instanciations, puis un traitement par l'instance mais sur un nombre réduit de données

    et puis je me suis dit que puisque de toute façons , les données de chaque instances n'etaient que des références aux données contenu dans la fabrique autant tout passer à l'instance en bloc, ce qui simplifie les choses , élimine un tri aux instanciations, mais allonge le temps de traitement des données par chaque instances.
    bref, mis à part le fait que le traitement ne se fait plus par un accès disque mais par un accès mémoire. J'ai l'impression d'être revenu au point de départ.
    la question est : quelle est la bonne solution ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Je suis désolé, mais la question est trop générale, je ne comprends pas vraiment quel est le problème.

    Une chose est sûre, un accès mémoire est incomparablement plus rapide qu'un accès disque (à ce point, ce n'est plus une différence de performance, mais une différence de nature entre un algo exploitable et un qui ne l'est pas). Si en plus tu construit en mémoire une structure permettant un accès direct immédiat à la donnée dont tu as besoin (ça peut être un hash, un tableau, ou peut-être une structure imbriquée plus complexe), alors tu franchis peut-être un autre seuil changeant à nouveau la nature du traitement et l'accélérant possiblement de plusieurs ordres de grandeur.

    Mais, là pas assez de détails pour répondre concrètement, et le diable se cache dans les détails.

    PS: il me semble avoir reconnu ma tête en bas à gauche de l'image.


  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par vidici Voir le message
    Un fopen depuis la fabrique pour remplir un tableau ce qui fait un premier parcours des données, un premier tri et donc un autre parcours des données aux instanciations, puis un traitement par l'instance mais sur un nombre réduit de données
    Ce 2e traitement par instance s'effectue à partir de données en mémoire, ou bien à partir de données sur disque que tu as enregistrées lors du premier traitement ?

    Sinon, comme lolo : trop général, et en plus, je ne pratique pas Moose. Essaye d'extraire une petite partie de ton projet pour nous montrer un exemple de ce que tu souhaites comparer/optimiser.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    merci d'avoir répondu .
    après quelques heures écoulées, je me rends compte que ma question est assez ridicule.
    en fait je comprends naturellement que si je fait $a = 'adresse disque', $b = $a; $c = $a; $d = $a; ... je vais dupliquer un String
    Mai qu'est qui ce passe exactement quand je fais @a = ( un_truc un_autre_truc ) @b = @a; @c = @a; @d = @a .... l'écriture du code est assez semblable et pourtant le résultat n'est pas le même . Et qu'est ce qui se passerait si éventuellement un Objet contenant @d décidait de le modifier. Ce sont mes lacunes mis en lumière .
    c'est vrai que le rapport à la vidéo est assez lointain, mais elle est bien quand même.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Ce 2e traitement par instance s'effectue à partir de données en mémoire, ou bien à partir de données sur disque que tu as enregistrées lors du premier traitement ?

    Sinon, comme lolo : trop général, et en plus, je ne pratique pas Moose. Essaye d'extraire une petite partie de ton projet pour nous montrer un exemple de ce que tu souhaites comparer/optimiser.
    le second traitement se fait a partir de la mémoire. Pour chaque instance créee, la fabrique trie les donnée depuis un tableau des données complètes déjà chargées
    ça va être difficile d'extraire une partie du code pour une question d'ordre général . c'est en fait de se dire que si chaque instance d'une classe doit charger le même fichier de 400 000 lignes avec fopen depuis le disque , c'est forcement pas bien .

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par vidici Voir le message
    ça va être difficile d'extraire une partie du code pour une question d'ordre général . c'est en fait de se dire que si chaque instance d'une classe doit charger le même fichier de 400 000 lignes avec fopen depuis le disque , c'est forcement pas bien .
    Il est clair que si tu as le moyen de factoriser un traitement très consommateur, tu vas gagner. Les questions à se poser dans ton cas de figure particulier sont alors :
    - ce traitement de fichiers de 400k ligne est-il vraiment un gros consommateur de ressources ? (rappelons que le système d'exploitation et/ou le disque dur lui-même utilisent des caches/mémoires tampon qui peuvent rendre plus rapide l'accès récurrent à certaines données sur le disque).
    - la factorisation entrainera-t-elle une sur-consommation de ressources acceptables (mémoire le plus souvent, mais parfois aussi, CPU) ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    - ce traitement de fichiers de 400k ligne est-il vraiment un gros consommateur de ressources ?
    non, pas vraiment. Pour trouver les lignes qu'il me faut, je n'utilise pas de regex mais la methode index, qui est rapide. Mais il faut quand même parcourir les 400 000 lignes de fichier, qui n'est pas le seul, il y en a d'autres.
    C'est pourquoi, j'ai éliminé la solution ou la Fabrique trie pour l'Instance par ce que l'objet peut très bien dire ensuite qu'il n'avait pas besoin de ces données et on aura fait un tri pour rien.
    La troisième solution me parait la meilleure. La Fabrique se charge de récuperer tout le(s) fichier(s) dans un tableau(x) qui est donné en référence à chaque instance qui s'en sert si elle veut et qui se chargera de faire le tri qui de toutes façons devra être fait une fois pour chaque instance, Si elle en a besoin.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    J. Si en plus tu construit en mémoire une structure permettant un accès direct immédiat à la donnée dont tu as besoin (ça peut être un hash, un tableau, ou peut-être une structure imbriquée plus complexe),
    qui pourrait être par exemple un tableau du type %tab = ( $tab[alfred][données], $tab[maurice][données] ....) et ou l'instance n'aurait plus qu'a se référer pour trouver ses données... ce la ferait environ 25000 tableaux en sachant que si je n'instancie qu'un seul objet, cela ferait environ 24999 tableaux pour rien.
    je vais essayé.

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par vidici Voir le message
    je vais essayé.
    Ce qui te permettra de répondre à ma 2e interrogation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    - la factorisation entrainera-t-elle une sur-consommation de ressources acceptables (mémoire le plus souvent, mais parfois aussi, CPU) ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    c'est fait
    j'ai eu beaucoup de mal à enfoncer le hash dans le moose
    Mais le résultat est spectaculaire (par rapport à avant), après avoir chargé le fichier et cree le hash dans la fabrique ce qui prend une quinzaine de secondes, tout les autres opérations sur les instances sont Instantanées.
    C'est parfait.
    merci à tous pour l'aiguillage.

  11. #11
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Je m'en doutais. J'ai divisé le temps d’exécution d'une longue série de requêtes en base de données par 60 en chargeant la table concernée dans un hash et faisant les requêtes dans le hash.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Je m'en doutais. J'ai divisé le temps d’exécution d'une longue série de requêtes en base de données par 60 en chargeant la table concernée dans un hash et faisant les requêtes dans le hash.
    je me doutais que vous vous en doutassiez ! Merci encore. Sur ce je vais mettre resolu.

  13. #13
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Content si j'ai pu te rendre service, même si j'avais un peu de mal au départ à comprendre exactement
    ce dont tu avais besoin.

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

Discussions similaires

  1. Non conservation en mémoire d'objets STATIC
    Par wariom dans le forum Weblogic
    Réponses: 5
    Dernier message: 09/06/2008, 18h28
  2. Libération mémoire d'objet dynamique
    Par Romvaillant dans le forum C++
    Réponses: 17
    Dernier message: 13/10/2007, 22h46
  3. [Optimisation] Mémoire occupée par des images
    Par Crowell dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 23/05/2007, 16h34
  4. Optimisation mémoire sur des String
    Par CyberChouan dans le forum Langage
    Réponses: 6
    Dernier message: 25/02/2007, 20h25
  5. optimisation mémoire
    Par cgu dans le forum Général Java
    Réponses: 11
    Dernier message: 04/04/2006, 22h18

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