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 Delphi Discussion :

xml avec omnixml = perte de mémoire ?


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut xml avec omnixml = perte de mémoire ?
    Bonjour

    Dans un projet FMX, j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DefaultDOMVendor := sOmniXmlVendor;
    Dans une fonction, je lis ce fichier XML pour remplir plusieurs tableaux d'entier ou de single.
    Les tableaux sont dimensionnés et pré-remplis de 0 avant lecture du node XML correspondant.

    Dans la première version, je faisais un truc comme ça:
    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
     
      NdBlock := Node.ChildNodes.First;
      I       := 1;
      while Assigned(NdBlock) do
      begin
        NdLine := NdBlock.ChildNodes.First;
        while Assigned(NdLine) do
        begin
          if I <= High(Heights) then
            Heights[I] := GetInt(NdLine.NodeValue)
          else
            break;
          Inc(I);
          NdLine := NdLine.NextSibling;
        end;
        NdBlock := NdBlock.NextSibling;
      end;
    Entre la première et la dernière ligne de code, mon programme prenait 2.5mo de RAM supplémentaire. Je ne comprends toujours pas pourquoi.

    J'ai remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      K := 0;
      for I := 0 to Node.ChildNodes.Count - 1 do
      begin
        NdBlock := Node.ChildNodes[I];
        for J := 0 to NdBlock.ChildNodes.Count - 1 do
        begin
          Inc(K);
          Heights[K] := GetInt(NdBlock.ChildNodes[J].NodeValue)
        end;
      end;
    Maintenant, environ 1 mo de moins mais toujours une perte qui ne se rattrape jamais même après finalisation de mon IXMLDocument qui me sert de lecteur.


    Questions:
    Est-il normal que je perde autant de RAM à chaque utilisation ?

    Connaissez-vous une alternative qui ferait le boulot mieux que ça ?
    J-L aka Papy pour les amis

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 710
    Points : 5 332
    Points
    5 332
    Par défaut
    Comment est créé ton IXmlDocument ?
    Comment est-il détruit ?

    Je ne sais pas comment fonctionne OmniXml en interne, mais je suppose qu'il doit charger tout le document.
    Et si ton document est volumineux, cela prendra forcément de la place au niveau mémoire.

    D'après, ce que je vois, tu ne fais que de la lecture classique de nœuds XML.
    Pourquoi passer par une librairie tierce connue pour être peu performante et gourmande en mémoire alors que Delphi contient nativement ce qu'il faut ?
    D'ailleurs même le type à l'origine du projet, le reconnais et recommande l'utilisation de son autre projet (OXml, pour ce que ça vaut).

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut
    Tout simplement comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Xml := NewXMLDocument;
    Xml.LoadFromXML(contenuxml);
    ...
    Xml := nil;
    Pour le choix omnixml, c'est intégré à Delphi: Voir ici

    Quand à Oxml, il est payant et non inclus dans Delphi
    J-L aka Papy pour les amis

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 067
    Points
    41 067
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    que donnerait en conso de mémoire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      K := 0;
      for NdBlock in Node do
      begin
        for ChildNdBloc in NdBlock.ChildNodes do
        begin
          Inc(K);
          Heights[K] := GetInt(ChildNdBloc.NodeValue)
        end;
    est-ce que un FreeAndNil(XML) en lieu et place de XML:=nil est possible ? ne serait pas mieux ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut
    Je vais tester ça.

    Mais pour le FreeAndNil, sur une interface ??? Je suis surpris
    J-L aka Papy pour les amis

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut
    marche pas :

    [dcc32 Erreur] UnitEyeValues.pas(938): E2431 L'instruction for-in ne peut agir sur le type de collection 'IXMLNodeList' car 'IXMLNodeList' ne contient pas de membre pour 'GetEnumerator' ou n'est pas accessible
    J-L aka Papy pour les amis

  7. #7
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut
    Comprends plus !
    Je viens de tester en utilisant une expression régulière et j'ai le même comportement.
    On dirait que le tableau (même déjà dimensionné) tient plus de place en RAM s'il n'y a pas que des 0 dedans.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      Reg := TRegex.Create('\x3E(\d{1,})\x3C');
     
      // Heights
      FillChar(Heights, Length(Heights) * SizeOf(LongInt), 0);
      Node    := Node.NextSibling;
      K := 0;
      for Mch in Reg.Matches(Node.XML, 1) do
      begin
        Inc(K);
        Heights[K] := Mch.Groups[1].Value.ToInteger;
      end;
    Je vais laisser tomber pour le moment.
    Merci quand même de m'avoir lu
    J-L aka Papy pour les amis

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 710
    Points : 5 332
    Points
    5 332
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Pour le choix omnixml, c'est intégré à Delphi: Voir ici

    Quand à Oxml, il est payant et non inclus dans Delphi
    C'est bizarre qu'embarcadero l'utilise, c'est une librairie OpenSource.

Discussions similaires

  1. Réponses: 11
    Dernier message: 16/07/2007, 16h33
  2. Pertes de mémoire avec Rave
    Par stepschn dans le forum Delphi
    Réponses: 8
    Dernier message: 15/10/2006, 11h18
  3. [XML][XSL][FOP] transformation xml avec fop
    Par Le Marlou dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 05/12/2003, 16h58
  4. []générer et LIRE du xml avec vb: sélection d'un node
    Par chris21 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 19/09/2003, 13h14
  5. generer xsl depuis xml avec balises inconues ?
    Par cedre dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 24/06/2003, 09h00

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