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

Modules Perl Discussion :

Fusion de fichiers XML - utilisation des handlers (XML::Twig) ?


Sujet :

Modules Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 25
    Par défaut Fusion de fichiers XML - utilisation des handlers (XML::Twig) ?
    (Edit : Je me suis trompé, ce sujet serait mieux dans /Modules plutôt qu'ici. Si quelqu'un pouvait déplacer ce sujet... Merci d'avance !)

    Bonjour,

    récemment j'ai créé un topic qui traitait de la transformation des balises XML, et j'ai été bien aidé, alors je me permet un autre sujet.

    Je vais essayer d'être clair immédiatement cette fois-ci


    Sujet :
    Fusionner des fichiers XML possédant la même structure
    (racine : volume
    fils : entry (+ sous éléments))

    Problématique :
    Les fichiers xml sont ici très gros (entre 10 et 100 mo, entre 15 000 et 100 000 éléments <entry>).
    Il s'agit donc d'utiliser les handlers de XML::Twig (ou de proposer un autre module plus efficace dans ce cas-ci).
    On pourrait par exemple avancer entrée par entrée comme suit :

    1) si entry-fichier1 = entry-fichier2
    on insère certains fils de entry-fichier2 dans entry-fichier1

    2) si entry-fichier1 est inférieur (lexicographiquement) à entry-fichier2
    on passe à l'entry suivant du fichier1, on ne change pas entry-fichier2 (et on ne fait rien d'autre).

    3) si entry-fichier1 est supérieur (lexicographiquement) à entry-fichier1 (ce qui arrivera rarement), on ajoute entry-fichier2 en entier avant entry-fichier1, et on passe à l'entry suivant pour les deux fichiers.

    Sujet proche sur le forum :
    Une fusion de fichiers XML mais "à la Dom" (on charge tout en mémoire). Ici on voudrait une fusion "à la Sax" (avec donc les handlers).
    J'ai une version sans handler (issu du sujet en référence au-dessus), mais qui ne fonctionne pas (ou alors il faudrait que je laisse tourner ma machine toute une nuit...je n'ai pas essayé).


    Je cherche juste à avoir des pistes, pas forcément un code (ou alors juste un bout ), parce que ça m'a l'air costaud à faire quand même.

    Le plus difficile pour moi est le point 2) et 3), plus particulièrement d'avancer entrée par entrée dans deux fichiers à la fois.

    J'espère avoir été clair, comme je suis dans le flou, il se peut que mes explications s'en ressentent.

    (Pour indication :
    La transformation que j'ai adaptée du code de Djibrill, en DOM, prend entre 40min et 3heures pour mes sources. en SAX, avec un handler qui porte sur entry, je ne dépasse pas 2minutes.
    D'où mon envie de faire pareil ici !)

    Si vous avez vu des sujets similaires, un bouquin qui en parle, ou même que vous avez bossé sur quelque chose de proche, n'hésitez pas ! Même une idée tout simple peut m'aider.
    Sur le site officiel de Xml::Twig ou sur CPAN je n'ai trouvé aucune indication pour une telle application.

    Si jamais ce sujet me permet de réaliser quelque chose qui fonctionne, je mettrai le code, je pense que ça peut servir. Je commence de mon côté à tester comment faire.

  2. #2
    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 : 59
    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
    Par défaut
    As-tu regardé du coté du module XML::Merge ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 25
    Par défaut
    Oui, c'est un module intéressant, mais soit j'ai loupé mon test, soit il est également très long (au bout de 4h j'ai arrêté l'exécution).

    Je vais quand même tester à nouveau, on ne sait jamais. Parce qu'il n'y a pas de grosses difficultés dans les éléments à copier, enfin je ne pense pas.

    Je vais lancer quelques tests sur des fichiers plus petits de même structure puis sur les plus gros, et je vous donne la réponse (qui sera justifiée cette fois-ci).

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 25
    Par défaut
    Les tests sont finis !!

    En effet XML::Merge fonctionne très bien pour des fichiers pas trop gros, dès que je suis passé sur les gros fichiers :

    Out of memory !!

    Par contre, peut être que tu confirmeras Philou, mais ce serait une bonne solution d'utiliser Xml::Twig et Xml::Merge non ?

    Le problème des handlers persiste, mais peut être que j'avancerai mieux en utilisant les deux. Je vais tâtonner.

    Je met le petit bout de code relatif à Xml::Merge :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    use Xml::Merge;
     
    my $merge_obj = XML::Merge->new(
    'filename' => $FichierOne,
    );
    $merge_obj->merge('filename' => $FichierTwo);
    $merge_obj->write($FichierResultat);
    P.S. : il est incomplet, n'oubliez pas de définir vos variables !

  5. #5
    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 : 59
    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
    Par défaut
    Effectivement, XML::Merge intègre un parser DOM-like, et non pas SAX-like. De fait, il charge tout l'arbre des nœuds pour chaque fichier XML.

    Il te reste donc l'implémentation que tu as proposé à l'aide de XML::Twig. Mais je ne maitrise pas ce module.

  6. #6
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Citation Envoyé par japanatome Voir le message
    (Pour indication :
    La transformation que j'ai adaptée du code de Djibrill, en DOM, prend entre 40min et 3heures pour mes sources. en SAX, avec un handler qui porte sur entry, je ne dépasse pas 2minutes.
    D'où mon envie de faire pareil ici !)
    Quand tu dis en sax, ça veut dire en utlisant XML::Twig avec les twig_handler, c'est bien ça ? Car le code que je t'ai filé fais effectivement du DOM mais si tu l'as adapté, c'est sûr qu'il sera plus rapide. De 3h à 2min, ça change tout . D'ailleurs, pourrais tu nous le montrer ?

    Pour ta nouvelle problématique, rien ne vaut plus qu'un exemple concret. Montre nous 2 petits fichiers XML à fusionner et le fichier résultat XML que tu souhaiterais obtenir. C'est le moyen le plus simple pour que tout le monde se fasse une idée précise de ton souci et se plonge dans le code pour t'aider.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 25
    Par défaut
    Euh oui Djibril, je n'emploie pas forcément un vocabulaire strict (je fais du "Perl intuitif" ), mais ta méthode chargeait tout en mémoire (pour moi c'est du DOM) et quand on utilise les handler de twig, on passe en SAX. Quand j'ai vu que pour une des sources (96 000 éléments <entry>), prenait près de 3heures, je suis passé par un handler pour purger la mémoire.

    J'indiquerai ce nouveau code sans problème, dans le sujet précédent sur la transformation, que je met en lien ici pour ceux qui sont intéressés et qui ne l'ont pas vu :

    Utilisation des tables de hachage, transformation XML avec Twig

    Et pour ce sujet-ci je vais vous préparer les p'tits codes.
    Si j'ai un début de quelque chose, je le mettrai aussi.

    Je ferai tout ça d'ici ce soir.

    Merci d'avance pour vos réponses !

  8. #8
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Citation Envoyé par japanatome Voir le message
    Euh oui Djibril, je n'emploie pas forcément un vocabulaire strict (je fais du "Perl intuitif" ), mais ta méthode chargeait tout en mémoire (pour moi c'est du DOM) et quand on utilise les handler de twig, on passe en SAX. Quand j'ai vu que pour une des sources (96 000 éléments <entry>), prenait près de 3heures, je suis passé par un handler pour purger la mémoire.

    J'indiquerai ce nouveau code sans problème, dans le sujet précédent sur la transformation, que je met en lien ici pour ceux qui sont intéressés et qui ne l'ont pas vu :

    Utilisation des tables de hachage, transformation XML avec Twig

    Et pour ce sujet-ci je vais vous préparer les p'tits codes.
    Si j'ai un début de quelque chose, je le mettrai aussi.

    Je ferai tout ça d'ici ce soir.

    Merci d'avance pour vos réponses !
    C'était juste pour confirmer qu'on parle bien de la même chose. Effectivement la méthode handler de twig permet de ne mettre en mémoire que des portions de XML. J'en parle d'ailleurs dans cette article.

    Nous attendons donc tes fichiers et codes.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 25
    Par défaut
    Ne t'inquiètes pas Djibril, tes articles, ou indications, ou même critiques de livres, on été lus

    Mais ça veut pas dire que je les utilise correctement après. Malheureusement, c'est en forgeant qu'on devient forgeron, et apparemment je n'ai pas encore assez forgé .

    Mais j'en apprend tous les jours. Dernièrement c'est la gestion des arguments par Getopt::Long. Après il y a eu aussi la barre de progression (j'aime bien la partie code source).
    J'ai eu une période Interface TK aussi (mais là à part faire du copier/coller.... mais j'y reviendrai !)

    Enfin bref, mon truc du moment, c'est le Xml, et après avoir transformé, j'aimerais fusionner.

    Voici donc les codes :

    Fichier1.xml :

    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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <volume name="Morphalou" source-langage="fra" creation-date="Tue Jun  8 14:43:16 2010">
       <entry id="a">
          <head>
             <headword>a</headword>
             <pronunciation></pronunciation>
             <pos>s.</pos>
          </head>
       </entry>
       <entry id="a b c">
          <head>
             <headword>a b c</headword>
             <pronunciation></pronunciation>
             <pos>s.</pos>
          </head>
       </entry>
       <entry id="a-humain">
          <head>
             <headword>a-humain</headword>
             <pronunciation></pronunciation>
             <pos>adj.</pos>
          </head>
       </entry>
     
       <entry id="abaisser">
          <head>
             <headword>abaisser</headword>
             <pronunciation></pronunciation>
             <pos>v.</pos>
          </head>
       </entry>
    </volume>
    Fichier2.xml :

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    <?xml version="1.0" encoding="UTF-8"?>
    <volume>
      <entry id="a">
        <head>
          <headword>a</headword>
          <pronunciation></pronunciation>
          <pos></pos>
        </head>
        <sense id="s1">
          <definition>
            <label></label>
            <formula></formula>
          </definition>
          <gloss></gloss>
          <translations>
            <translation>mẫu tự đầu tiên và nguyên âm đầu tiên trong bảng chữ cái</translation>
          </translations>
          <examples>
            <example>a majuscule (A)</example>
            <example>a minuscule (a)</example>
          </examples>
          <idioms></idioms>
          <else1></else1>
          <else2>
            <m:else>danh từ giống đực ( không đổi)</m:else>
          </else2>
        </sense>
        <sense id="s2">
          <definition>
            <label></label>
            <formula></formula>
          </definition>
          <gloss></gloss>
          <translations>
            <translation>nốt nhạc la (thuật ngữ (âm nhạc) thuộc Anglo-Saxon và Đức)</translation>
            <translation>a (sào)</translation>
            <translation>ampe</translation>
            <translation>angström</translation>
          </translations>
          <examples></examples>
          <idioms></idioms>
          <else1></else1>
          <else2>
            <m:else>viết tắt và ký hiệu của:</m:else>
          </else2>
        </sense>
        <sense id="s3">
          <definition>
            <label></label>
            <formula></formula>
          </definition>
          <gloss></gloss>
          <translations>
            <translation>thành phần lấy từ tiếng Latinh, để chỉ hướng, đích đến, hoặc từ trạng thái này sang trạng thái khác Amener,  alunir,  adoucir</translation>
          </translations>
          <examples></examples>
          <idioms></idioms>
          <else1></else1>
          <else2>
            <m:else>tiếp đầu ngữ</m:else>
          </else2>
        </sense>
      </entry>
      <entry id="abaca">
        <head>
          <headword>abaca</headword>
          <pronunciation></pronunciation>
          <pos></pos>
        </head>
        <sense id="s1">
          <definition>
            <label></label>
            <formula></formula>
          </definition>
          <gloss></gloss>
          <translations>
            <translation>một loại chuối ở Philipine, vỏ dùng để dệt.</translation>
          </translations>
          <examples></examples>
          <idioms></idioms>
          <else1></else1>
          <else2>
            <m:else>danh từ giống đực</m:else>
          </else2>
        </sense>
      </entry>
      <entry id="abacule">
        <head>
          <headword>abacule</headword>
          <pronunciation></pronunciation>
          <pos></pos>
        </head>
        <sense id="s1">
          <definition>
            <label></label>
            <formula></formula>
          </definition>
          <gloss></gloss>
          <translations>
            <translation>hình khối nhỏ tạo nên thành phần của một hình khảm.</translation>
          </translations>
          <examples></examples>
          <idioms></idioms>
          <else1></else1>
          <else2>
            <m:else>danh từ giống đực</m:else>
          </else2>
        </sense>
      </entry>
    </volume>
    Je donne les objectifs suivants (ils ont un peu changé) :

    1) si entry-fichier1 = entry-fichier2 (je travaille au niveau des id, mais le headword marche aussi)
    => on insère les éléments <sense> de fichier2, on passe aux entry suivants pour les deux fichiers.

    2) si entry-fichier1 est lexicographiquement (selon l'ordre alphabétique) inférieur (avant) entry-fichier2, alors
    => on passe à entry-fichier1 suivant, on n'ajoute rien.

    3) si entry-fichier1 est lexicographiquement supérieur (après) entry-fichier2, alors
    => on passe à entry-fichier2 suivant, on n'ajoute rien.

    Le cas 3) ne se présente pas dans l'exemple, pour ma part je ne le traite pas pour le moment, je me focalise sur les deux premiers cas. J'ajouterai le 3ème ensuite.

    Résultat :

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    <?xml version="1.0" encoding="UTF-8"?>
     
    <volume name="Morphalou" source-langage="fra" creation-date="Tue Jun  8 14:43:16 2010">
       <entry id="a">
          <head>
             <headword>a</headword>
             <pronunciation></pronunciation>
             <pos>s.</pos>
          </head>
          <sense id="s1">
          <definition>
            <label></label>
            <formula></formula>
          </definition>
          <gloss></gloss>
          <translations>
            <translation>mẫu tự đầu tiên và nguyên âm đầu tiên trong bảng chữ cái</translation>
          </translations>
          <examples>
            <example>a majuscule (A)</example>
            <example>a minuscule (a)</example>
          </examples>
          <idioms></idioms>
          <else1></else1>
          <else2>
            <m:else>danh từ giống đực ( không đổi)</m:else>
          </else2>
        </sense>
        <sense id="s2">
          <definition>
            <label></label>
            <formula></formula>
          </definition>
          <gloss></gloss>
          <translations>
            <translation>nốt nhạc la (thuật ngữ (âm nhạc) thuộc Anglo-Saxon và Đức)</translation>
            <translation>a (sào)</translation>
            <translation>ampe</translation>
            <translation>angström</translation>
          </translations>
          <examples></examples>
          <idioms></idioms>
          <else1></else1>
          <else2>
            <m:else>viết tắt và ký hiệu của:</m:else>
          </else2>
        </sense>
        <sense id="s3">
          <definition>
            <label></label>
            <formula></formula>
          </definition>
          <gloss></gloss>
          <translations>
            <translation>thành phần lấy từ tiếng Latinh, để chỉ hướng, đích đến, hoặc từ trạng thái này sang trạng thái khác Amener,  alunir,  adoucir</translation>
          </translations>
          <examples></examples>
          <idioms></idioms>
          <else1></else1>
          <else2>
            <m:else>tiếp đầu ngữ</m:else>
          </else2>
        </sense>
        </entry>
       <entry id="a b c">
          <head>
             <headword>a b c</headword>
             <pronunciation></pronunciation>
             <pos>s.</pos>
          </head>
       </entry>
       <entry id="a-humain">
          <head>
             <headword>a-humain</headword>
             <pronunciation></pronunciation>
             <pos>adj.</pos>
          </head>
       </entry>
     
       <entry id="abaisser">
          <head>
             <headword>abaisser</headword>
             <pronunciation></pronunciation>
             <pos>v.</pos>
          </head>
       </entry>
    </volume>

    J'essaie pour l'instant de faire quelque chose en associant Xml::Twig et Xml::Merge.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 25
    Par défaut Proposition personnelle.


    J'ai laissé tombé Xml::Merge pour le moment.

    Je tente cette idée :

    (1) je modifie le caractère de fin de ligne avec $/ (j'indique la balise fermante de l'élément 'entry').

    (2) avec un while tant que j'ai des lignes dans le fichier 1 OU dans le fichier 2,
    je compare les entrées et je procède selon les indications que j'avais données dans mes messages précédents.

    Quand on écrit quelque chose comme ça :

    Seule la première ligne est chargée, ou alors il parcours tout le fichier ? Parce que si il fait tout le fichier, puis il me donne la première ligne, c'est comme si je faisais du DOM, et donc je ne réduit pas l'utilisation de la mémoire...

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

Discussions similaires

  1. Utiliser des données XML avec Excel ?
    Par sky1989 dans le forum Excel
    Réponses: 3
    Dernier message: 29/03/2012, 21h48
  2. doc XML utiliser des conditions
    Par clouddd dans le forum C#
    Réponses: 5
    Dernier message: 07/06/2011, 14h00
  3. Réponses: 1
    Dernier message: 29/04/2009, 10h43
  4. [xslt][xpath]Utilisation des attributs XML
    Par Little_flower dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 15/05/2007, 12h42
  5. Réponses: 1
    Dernier message: 01/07/2006, 11h18

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