PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 22 → Pas assez de mémoire fChargeTexte
Pas assez de mémoire fChargeTexte
Débuté par Mathieu Brousseau, 03 mar. 2015 16:09 - 21 réponses
Posté le 03 mars 2015 - 16:09
J'essai de lire un fichier XML, mais la fonction fChargeTexte pose problème, en effet elle plante à tout les coups en disant " Pas assez de mémoire " alors que le fichier ne fait que 150mo.

SI fChargeTexte( SAI_Fichier ) = "" ALORS
Erreur(ErreurInfo())
FIN


Si je compile en 64bits, l'application fonctionne correctement et utilise ~700mo de RAM.
En 32bits, elle plante à tous les coups.

Sachant que j'ai suffisant de mémoire vive et que le 700mo utilisé en 64bits est bien inférieurs au 1.5go maximum par processus 32bits, Est-ce possible de faire fonctionner cette fonction sous 32bits?

J'ai rencontré cette limite de 150-200mo par fichier pour les types de fichiers que j'ai testé (videos, xml, sql, ...)

Bref, est-ce qu'il y a une façon de compiler mon exécutable 32bits pour qu'il puisse utiliser les 1.5go-2go maximum théorique par processus?
Posté le 03 mars 2015 - 18:00
Je crois avoir une piste de solution

En modifiant la priorité de l'application via le gestionnaire des taches de windows pour priorité élevé, l'application 32bits arrive à supporter mes gros fichiers.

J'ai essayé la fonction
ThreadPriorité(ThreadCourant() , PrioritéElevée)


Malheureusement, ThreadCourant() fonctionne uniquement pour les threads secondaires.

Quelqu'un saurait comment modifier la priorité du Thread Principale?
Posté le 05 mars 2017 - 19:35
bonsoir,
désolé si je ne m'exprime pas correctement en programmation, je suis débutant....:)
j'ai un fichier XML de 550 Mo et je n'arrive pas à l'intégrer à mon projet... j'ai testé le code avec des petits fichiers et là pas de problème.
mais quand j'utilise le code sur ce gros fichier.... message d'erreur "mémoire insuffisante".... quelqu'un peut-il m'aider
merci d'avance
ci-dessous le code que j'utilise

MonDoc est une chaîne = fChargeTexte(SAI_FIC)
XMLDocument("xml", MonDoc)
XMLRecherche("xml","Piece",XMLBalise,XMLContient)
TANTQUE XMLTrouve("xml")=Vrai
Trace(XMLDonnée("xml","TypeRef",XMLExact)+TAB+XMLDonnée("xml","IdBord",XMLExact)+TAB+XMLDonnée("xml","IdPiece",XMLExact)+TAB+XMLDonnée("xml","ExerRattach",XMLExact)+TAB+XMLDonnée("xml","DateEmissionPiece",XMLExact)+TAB+XMLDonnée("xml","IdLigne",XMLExact))
XMLSuivant("xml")
FIN
XMLSuivant("xml")
Membre enregistré
1 081 messages
Posté le 06 mars 2017 - 04:10
Bonjour,

Pourquoi ne pas utiliser une variable de type XMLDocument et la fonction XMLOuvre ? C’est tellement plus simple

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Posté le 06 mars 2017 - 12:04
Bonjour

est ce que tu teste/compile en 64 bits ?

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

A votre disposition : WXShowroom.com, WXReplication (open source) et
maintenant WXEDM (open source)

Plus d'information sur http://fabriceharari.com


Le 3/5/2017 à 1:35 PM, Romagnol a écrit :
bonsoir,
désolé si je ne m'exprime pas correctement en programmation, je suis
débutant....:)
j'ai un fichier XML de 550 Mo et je n'arrive pas à l'intégrer à mon
projet... j'ai testé le code avec des petits fichiers et là pas de
problème.
mais quand j'utilise le code sur ce gros fichier.... message d'erreur
"mémoire insuffisante".... quelqu'un peut-il m'aider
merci d'avance ci-dessous le code que j'utilise

MonDoc est une chaîne = fChargeTexte(SAI_FIC)
XMLDocument("xml", MonDoc)
XMLRecherche("xml","Piece",XMLBalise,XMLContient)
TANTQUE XMLTrouve("xml")=Vrai
Trace(XMLDonnée("xml","TypeRef",XMLExact)+TAB+XMLDonnée("xml","IdBord",XMLExact)+TAB+XMLDonnée("xml","IdPiece",XMLExact)+TAB+XMLDonnée("xml","ExerRattach",XMLExact)+TAB+XMLDonnée("xml","DateEmissionPiece",XMLExact)+TAB+XMLDonnée("xml","IdLigne",XMLExact))

XMLSuivant("xml")
FIN
XMLSuivant("xml")
Membre enregistré
74 messages
Posté le 06 mars 2017 - 19:09
Mathieu,

Si c'est réellement ce que tu veux faire alors Exepriorité() est ce que tu cherche !

Bon Dev,
Membre enregistré
662 messages
Popularité : +13 (13 votes)
Posté le 07 mars 2017 - 07:11
hello,
Philippe SB a écrit :
> Pourquoi ne pas utiliser une variable de type XMLDocument et la fonction XMLOuvre ? C’est tellement plus simple

j'ai essayé d'utiliser la fonction XMLOuvre avec un fichier xml de 705 Mo (du moins avec la version 16 de windev) . Impossible d'ouvrir le fichier :
MonFluxXml est un WL.XMLDocument
MonFluxXml = XMLOuvre("F:\bigdatabase\bigxml.xml", depuisFichier)
SI ErreurDétectée = Vrai ALORS
Erreur("Impossible d'ouvrir le fichier XML : "+ ErreurInfo())
FIN


Par contre en utilisant l'assemblage dotnet System.XML et un "flux" (stream) fichier j'ai pu lire ce fichier :
fs est un FileStream("F:\bigdatabase\bigxml.xml", FileMode.OpenOrCreate,FileAccess.Read, FileShare.Read);
// Create the XmlReader object.
MonXmlreader est un XmlReader dynamique = XmlReader.Create(fs)
TANTQUE MonXmlreader.Read()
// on affiche le contenu de toutes les balises title
SI MonXmlreader.Name = "title" ALORS Trace(MonXmlreader.ReadString())
FIN


--
Ami calmant, J.P
Posté le 09 mars 2017 - 21:10
bonsoir,
tout d'abord merci d'avance pour vos réponses rapides mais comme on me l'a suggérer j'ai essayé d'utiliser avec la commande xmlouvre et xmldocument, mais mon code bugg....

au secours, je commence à désespérer..

mon code :
Flux est un xmlDocument
Flux = XMLOuvre(SAI_FIC, depuisFichier)
SI ErreurDétectée = Vrai ALORS
        Erreur("Impossible d'ouvrir le fichier XML")
SINON
XMLDocument("xml",Flux)
XMLRecherche("xml","Piece",XMLBalise,XMLContient)
TANTQUE XMLTrouve("xml")=Vrai
Trace(XMLDonnée("xml","TypeRef",XMLExact)+TAB+XMLDonnée("xml","IdBord",XMLExact)+TAB+XMLDonnée("xml","IdPiece",XMLExact)+TAB+XMLDonnée("xml","ExerRattach",XMLExact)+TAB+XMLDonnée("xml","DateEmissionPiece",XMLExact)+TAB+XMLDonnée("xml","IdLigne",XMLExact))
XMLSuivant("xml")

FIN
FIN


message d'erreur :

Erreur à la ligne 7 du traitement Clic sur BTN_SansNom2.
Vous avez appelé la fonction XMLDocument.
Le passage du paramètre 1 a provoqué une erreur.
Un élément de type 'xmlDocument' ne peut pas être converti vers le type 'chaîne ANSI'.

----- Informations techniques -----

Projet : Bestiole

Appel WL :
Traitement de 'Clic sur BTN_SansNom2' (FEN_import.BTN_SansNom2), ligne 7, thread 0
Fonction 'XMLDocument', syntaxe 0

Que s'est-il passé ?
Le passage du paramètre 1 a provoqué une erreur.
Un élément de type 'xmlDocument' ne peut pas être converti vers le type 'chaîne ANSI'.

Code erreur : 1021
Niveau : erreur fatale (EL_FATAL)

Dump de l'erreur du module 'wd180vm.dll' (18.0.150.3).
Identifiant des informations détaillées (.err) : 1021
Informations de débogage :
UEL = 107
Informations supplémentaires :
EIT_PILEWL :
Clic sur BTN_SansNom2 (FEN_import.BTN_SansNom2), ligne 7
EIT_DATEHEURE : 09/03/2017 21:06:28

Assistance

bonne soirée et merci d'avance pour votre aide
Posté le 09 mars 2017 - 21:12
bonsoir sylvain,
j'ai le même problème donc je vais tester ta piste
bonne soirée et merci pour ta réponse
Posté le 09 mars 2017 - 21:17
bonsoir Jurassic Pork,
merci pour ta réponse mais là je suis désolé, mais je n'ai pas ton niveau et j'ai rien compris...
peux tu développé un peux

merci d'avance
comme quoi un débutant lire et recherche...


ci-dessous tu peux voir mon nouvel essai... et oui il ne fonctionne pas...


// Chargement du flux RSS des derniers articles publiés sur le forum pcsoft.fr.windev
Flux est un xmlDocument
Flux = XMLOuvre(SAI_FIC, depuisFichier)
SI ErreurDétectée = Vrai ALORS
        Erreur("Impossible d'ouvrir le fichier XML")
SINON
XMLDocument("xml",Flux)
XMLRecherche("xml","Piece",XMLBalise,XMLContient)
TANTQUE XMLTrouve("xml")=Vrai
Trace(XMLDonnée("xml","TypeRef",XMLExact)+TAB+XMLDonnée("xml","IdBord",XMLExact)+TAB+XMLDonnée("xml","IdPiece",XMLExact)+TAB+XMLDonnée("xml","ExerRattach",XMLExact)+TAB+XMLDonnée("xml","DateEmissionPiece",XMLExact)+TAB+XMLDonnée("xml","IdLigne",XMLExact))
XMLSuivant("xml")

FIN
FIN

Ps : il bugg en ligne 7...
Membre enregistré
1 081 messages
Posté le 10 mars 2017 - 08:49
Bonjour,

C'est juste que tu n'utilises pas les choses de la bonne manière. XMLDocument,() crée un document XML et il attend en paramètre une chaine xml. Ta variable flux est déjà chargée avec le xml de ton fichier.

Essaye ça. Attention !!! A toi de définir l'arborescence de ton fichier xml:
// Chargement du flux RSS des derniers articles publiés sur le forum pcsoft.fr.windev
Flux est un xmlDocument
Flux = XMLOuvre(SAI_FIC, depuisFichier)
SI ErreurDétectée = Vrai ALORS
        Erreur("Impossible d'ouvrir le fichier XML")
SINON
POUR TOUT Fils de Flux.root.Piece
POUR TOUT attribut de Fils..Attribut
Trace(attribut..Nom+": "+attribut..Valeur)
FIN
FIN
FIN


--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Message modifié, 10 mars 2017 - 08:50
Posté le 10 mars 2017 - 20:03
bonsoir Philippe,
je te remercie beaucoup pour ton code.. mais avant de le personnalisé, je vais regarder sur la doc en ligne de PC SOFT des différentes fonctions que tu as utilisé.
car oui c'est un problème actuel, mais mon but c'est que je comprends ce que tu as fait et que peut être un jour je pourrais rendre l'appareil

en tout cas un GRAND MERCI et bonne soirée.

je te tiens au courant.. (je vais essayer ce week-end)
Membre enregistré
662 messages
Popularité : +13 (13 votes)
Posté le 11 mars 2017 - 11:21
hello
romagnol a écrit :
bonsoir Jurassic Pork,
merci pour ta réponse mais là je suis désolé, mais je n'ai pas ton niveau et j'ai rien compris...


dans ton projet tu rajoutes les assemblages dotnet System et System.xml :
--> menu Projet/Importer/Un assemblage .NET et dans la fenêtre liste des assemblages qui s'ouvre cocher les assemblages System et System.XML et voilà tu peux utiliser le code que j'ai mis dans mon message précédent.

--
Ami calmant, J.P
Posté le 11 mars 2017 - 21:06
bonsoir J.P.
merci pour tes précisions sur ton code.. que j'ai essayé
oui le trace s'ouvre mais par contre j'ai <\n> d'affiché...
aurais-tu une idée, moi j'ai pensé que le texte n'est pas au bon format
merci d'avance et bonne soirée à tous
Posté le 12 mars 2017 - 13:08
bonjour Jurassic Pork,
je ne vois pas comment je peux récupérer les valeurs des attributs avec ton code car, je ne n'arrive pas à récupérer le texte.
le trace me restitue </n>
le problème ne viendrai pas de l'encodage de mon XML qui est en "ISO-8859-15"
merci d'avance
Posté le 19 mars 2017 - 19:53
bonsoir PHILIPPE SB,
désolé pour mon silence, mais en plus d'essayer de comprendre ton code j'ai également fait beaucoup de recherche de mon côté.
ton code fonctionne parfaitement pour des petits fichiers XML par contre je dois importer un XML de 3 millions de lignes, c'est le nombre que j'obtiens avec Notepad.
donc la ça bloque..
aurais tu une piste
merci d'avance
Membre enregistré
1 081 messages
Posté le 20 mars 2017 - 04:01
Bonjour,

tu es en 32 ou 64 bits ? et ton appli est en 32 ou 64 bits ?

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Posté le 20 mars 2017 - 10:54
bonjour Philippe
merci d'avoir répondu, je suis en 32 bits
ce que je veux c'est récupérer les balises pour les ajouter dans 5 HFSQL (une HFSQL par balise)
merci d'avance
Membre enregistré
1 081 messages
Posté le 20 mars 2017 - 12:12
Bonjour,

Je doute que le 32 bits soit capable de gérer une telle quantité de donnée. Soit tu passes sur du 64 bits, soit il te reste la solution de jp qui me semble être une bonne solution.

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Membre enregistré
662 messages
Popularité : +13 (13 votes)
Posté le 20 mars 2017 - 12:38
hello,
Romagnol a écrit :
bonsoir J.P.
merci pour tes précisions sur ton code.. que j'ai essayé
oui le trace s'ouvre mais par contre j'ai <\n> d'affiché...
aurais-tu une idée, moi j'ai pensé que le texte n'est pas au bon format
merci d'avance et bonne soirée à tous

c'est certainement normal si tu n'as pas modifié mon code car il ne correspond pas à ton fichier xml. Il faut faire le traitement en fonction de ce que tu veux extraire.

--
Ami calmant, J.P
Posté le 20 mars 2017 - 13:01
Te fatigue pas Philippe... Je lui ai déjà dit de faire ca il y 2 semaines...

Il ne veut visiblement pas...

Le 3/20/2017 à 6:12 AM, Philippe SB a écrit :
Bonjour,

Je doute que le 32 bits soit capable de gérer une telle quantité de
donnée. Soit tu passes sur du 64 bits, soit il te reste la solution de
jp qui me semble être une bonne solution.

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Posté le 21 mars 2017 - 00:52
bonsoir,
merci Philippe et JURASSIC PORK pour votre aide... et votre patience.