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

VB.NET Discussion :

Problème d'outOfMemoryException dans le traitement d'un xml


Sujet :

VB.NET

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Par défaut Problème d'outOfMemoryException dans le traitement d'un xml
    Bonjour à tous,

    je débute en vb.net et j'ai un problème d'outOfMemoryException que je n'arrive pas à résoudre.

    Voilà, j'ai fait un petit programme pour traiter un fichier xml.
    Dans un premier temps, il ouvre mon fichier xml (qui fait environ 50 Mo) dans une textbox invisible.
    Je copie ensuite le texte dans une autre textbox visible cette fois-ci dans laquelle je vais faire mon traitement (ceci afin que le fichier d'origine ne soit pas modifié).
    Je fais un premier traitement de remplacement de valeur d'une balise et je sauvegarde mes modifs dans un fichier temporaire; je vide ma textbox visible et je recopie le données de ce fichier temporaire dedans afin que l'utilisateur vérifie les modifs :

    Code vb : 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
        Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Dim element As Xml.XmlNodeList
            Dim noeud As Xml.XmlNode
            Dim TextXML As Xml.XmlDocument = New Xml.XmlDocument
            Dim a As Integer = 0
            TextXML.LoadXml(TextBox2.Text)
            element = TextXML.DocumentElement.GetElementsByTagName("ThemeValueColumnType")
     
            For Each noeud In element
                element(a).InnerText = "1"
                a = a + 1
            Next
     
            TextXML.Save("C:\Temp\tempxml.mwx")
            TextBox2.Clear()
            TextBox2.Text = My.Computer.FileSystem.ReadAllText("C:\Temp\tempxml.mwx")
     
        End Sub


    puis je fais un find/replace automatique dans ces données modifiées. et c'est que ça plante, que je fasse le traitement directement dans le textbox ou dans un autre fichier temporaire :


    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
            Dim myText As String = File.ReadAllText("C:\Temp\tempxml.mwx")
            Dim myTextReplace As String = myText.Replace(ComboBox1.Text, ComboBox2.Text)
            File.WriteAllText("C:\Temp\tempxmlreplace.mwx", myTextReplace) 'pour réecrire le texte dans un autre fichier.
            TextBox2.Clear()
            TextBox2.Text = My.Computer.FileSystem.ReadAllText("C:\Temp\tempxmlreplace.mwx")
            'TextBox2.Text = Replace(TextBox2.Text, ComboBox1.Text, ComboBox2.Text)
        End Sub

    j'ai cherché toute la matinée sans réussir à résoudre le problème.
    Quelqu'un pourrait-il m'aider svp ?

    Merci d'avance pour vos réponses

  2. #2
    Membre Expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Par défaut
    Ce serait bien de dire sur quelle ligne ça plante exactement mais je ne comprends pas ce que font les comboBox1 et ComboBox2 dans ton Replace.
    Si en plus tu peux mettre ton code entre les balises Code (Le bouton # au dessus de la zone d'édition du message), ce serait parfait

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Par défaut
    ok, désolé.

    alors ça plantait au niveau de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim myText As String = File.ReadAllText("C:\Temp\tempxml.mwx")
    Je viens de modifier le fait de dans un premier temps, j'ouvre mon fichier xml dans une textbox invisible : je l'ouvre directement dans le textbox visible.
    et maintenant ça plante au niveau de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim myTextReplace As String = myText.Replace(ComboBox1.Text, ComboBox2.Text)
    je ne comprend toujours pas

  4. #4
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Par défaut
    les combobox sont là pour que l'utilisateur puisse choisir quel terme il veut remplacer et par quoi...

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Par défaut
    ci-dessous mon code :

    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
     
    Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    Dim element As Xml.XmlNodeList
    Dim noeud As Xml.XmlNode
    Dim TextXML As Xml.XmlDocument = New Xml.XmlDocument
    Dim a As Integer = 0
    TextXML.LoadXml(TextBox2.Text)
    element = TextXML.DocumentElement.GetElementsByTagName("ThemeValueColumnType")
     
    For Each noeud In element
    element(a).InnerText = "1"
    a = a + 1
    Next
     
    TextXML.Save("C:\Temp\tempxml.mwx")
    TextBox2.Clear()
    TextBox2.Text = My.Computer.FileSystem.ReadAllText("C:\Temp\tempxml.mwx")
     
    End Sub
     
    Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
    Dim myText As String = File.ReadAllText("C:\Temp\tempxml.mwx")
    Dim myTextReplace As String = myText.Replace(ComboBox1.Text, ComboBox2.Text)
    File.WriteAllText("C:\Temp\tempxmlreplace.mwx", myTextReplace) 'pour réecrire le texte dans un autre fichier.
    TextBox2.Clear()
    TextBox2.Text = My.Computer.FileSystem.ReadAllText("C:\Temp\tempxmlreplace.mwx")
    'TextBox2.Text = Replace(TextBox2.Text, ComboBox1.Text, ComboBox2.Text)
    End Sub

    désolé, pour les extraits de réponse. Je n'ai pas l'habitude.
    Merci pour votre aide

  6. #6
    Membre Expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Par défaut
    L'exception OutOfMemoryException signifie qu'il n'y a pas assez de mémoire pour stocker l'intégralité de ton fichier en mémoire.
    Voir LA

    Sinon, juste pour info, tu n'es pas obligé de recréer un message à chaque fois si ton dernier n'est pas complet, tu peux l'éditer

  7. #7
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Par défaut
    oui, j'avais bien compris que c'était un problème de mémoire. Y-t-il une solution pour contourner le problème ?

    Le find/replace fonctionnait très bien avant que j'insère un traitement de balise.

  8. #8
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Bah un XML ne se traite pas en le chargeant dans une string; ça c'était valable il y a 10 ans. Maintenant il existe des outils pour traiter des XML. Un document XML n'est pas une chaine de caractères, c'est un flux.
    Tu as le choix entre utiliser les XmlReader/XmlWriter ou passer par un XmlDocument. Tu peux aussi regarder du côté de LINQ to XML.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  9. #9
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Par défaut
    bon après de multiples manipulations pour traiter mon xml en xml et non plus en string, j'ai finit par trouver une solution toute bête : inverser mon pré-traitement et mon find/replace... j'ai un peu honte...

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

Discussions similaires

  1. [AJAX] Gestion mémoire dans un traitement
    Par Psycadi dans le forum AJAX
    Réponses: 1
    Dernier message: 02/09/2010, 14h58
  2. problème d'encodage dans print et sur fichier xml
    Par paissad dans le forum Langage
    Réponses: 8
    Dernier message: 05/05/2010, 13h52
  3. [SSAS]Problème dans le traitement d'un cube
    Par Safaritn dans le forum SSAS
    Réponses: 2
    Dernier message: 27/09/2008, 09h35
  4. problème dans le traitement des couleurs
    Par sironimo dans le forum Graphisme
    Réponses: 33
    Dernier message: 22/12/2005, 13h52
  5. problème de guillemets dans une formule shell
    Par dim_italia dans le forum VBA Access
    Réponses: 7
    Dernier message: 18/08/2003, 12h46

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