PB à toute heure et à tout moment. (à parcourir avec modération)

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 15-12-2015 12:54:53

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

[RESOLU]crash lors de la lecture d'un gros fichier texte

Des fois que vous auriez déjà eu ça : la lecture d'un gros fichier texte plante sur un manque de mémoire.

Pourtant le fichier fait moins de 2 Go, qui est une limite possible pour les strings mais j'essaie de lire le fichier dans un blob avec FileReadEx() et il ne fait "que" 130 632 351 octets. C'est un fichier xml et mon PB est 11.5.1 build 4843

Le code est simplissime et le plantage est sur la ligne du FileReadEx():

Code: pb

string ls_file
long ll_hfile
blob lbl_bigfile
ll_hfile = FileOpen( as_file, StreamMode! )
FileReadEx( ll_hfile, lbl_bigfile ) // <=== BOUM !
FileClose( ll_hfile )
return string( lbl_bigfile, GetBlobEncoding(lbl_bigfile) )


https://i.imgur.com/qYssYTy.png

La fonction GetBlobEncoding() c'est un truc à moi qui retourne un type encoding (encodingAnsi!, encodingutf8!, ...) en fonction du contenu d'un blob, ça me permet de gérer moi même certains problèmes lié aux encodages.

Bon, je pense que la lecture de ce gros fichier pour finir dans une string n'est pas la meilleure solution avec PB et va peut-être se faire remanier. C'était pour gérer la validation xml par rapport à un schéma, et ça fonctionne sur d'autre fichiers plus petits.


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#2 15-12-2015 15:23:47

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU]crash lors de la lecture d'un gros fichier texte

Salut, dans ton mailslot tu utilises une fonction externe :

Code: pb

Function boolean ofx_ReadFile ( ulong hFile              ,    &
                  ref string lpBuffer            ,    &
                     ulong nNumberOfBytesToRead  ,     &
                  ref ulong lpNumberOfBytesRead  ,    &
                     ulong lpOverlapped)                   library "kernel32.dll"  alias for "ReadFile"


ça ne marche pas mieux ?


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#3 16-12-2015 09:01:08

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU]crash lors de la lecture d'un gros fichier texte

Je ne me souvenais plus de ça...
Cool, j'ai au moins un lecteur de mes œuvres !

Je comptais chercher une solution sans devoir passer par l'api windows, mais je vais quand même essayer.


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#4 16-12-2015 13:56:58

Van  
Bienfaiteur du site
Award: bf
Lieu: mouvaux
Date d'inscription: 19-03-2013
Messages: 125
Pépites: 673
Banque: 41

Re: [RESOLU]crash lors de la lecture d'un gros fichier texte

Bonjour,

Pourquoi ne pas tenter une boucle de fileRead jusqu'a ce que la fonction te retourne 0.
Si je dis pas de connerie (ça fait un moment que j'ai pas fait de lecture de fichier) le pointeur devrait bouger au fur et à mesure des fileread si ton fichier est ouvert en streamMode comme c'est le cas dans ton code (si c'est pas le cas faut jouer avec fileSeek).

Tu remplis au coup par coup par bloc de 32 765 bytes ta variable ls_file avec le résultat de ton file read.

Code: pb

string ls_file, ls_returnChars = ""
long ll_hfile, ll_nbOfReturnChars = 0

ll_hfile = FileOpen( as_file, StreamMode! )

do 
  ll_nbOfReturnChars = FileRead( ll_hfile, ls_returnChars ) 
  
  if ll_nbOfReturnChars > 0 then 
    ls_file = ls_file + ls_returnChars
  end if
  
loop while ll_nbOfReturnChars > 0
  
FileClose( ll_hfile )
return ls_file


J'ai pas le temps de tester avec un fichier de ta volumétrie mais ça devrait passser je pense.

Dernière modification par Van (16-12-2015 13:57:55)


Tant que ça bouge c'est pas mort, dans le doute frappe encore!
Ni dieu ni maître, sauf maître Kanter!

Hors ligne

 

#5 21-12-2015 14:20:23

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU]crash lors de la lecture d'un gros fichier texte

J'ai tenté de remplacer la lecture par ceci :
- détermination de la taille du faichier
- allocation par un blob_alloc() des "fast funcs" qui n'oblige pas à bricoler en allouant une string avec space() pour pouvoir écrire dans le buffer depuis l'API
- lecture du fichier avec un ReadFile système comme suggéré par Erasorz

Résultat :
il y a toujours un bug de plus : ça fonctionne très bien avec le gros xml, mais ça plante alors dans ma fonction GetBlobEncoding() où un if Byte(blobmid(ab_data,1,1)) = 255 (en fait elle ne "plante" pas vraiment, elle ne fait juste plus rien, plus d'activité CPU et ne rend pas la main) alors que PB utilise déjà ~380 Mo de RAM.

Code: pb

constant ulong GENERIC_READ  = 2147483648 //0x80000000
constant ulong FILE_SHARE_READ = 1
constant ulong OPEN_EXISTING = 3
constant ulong FILE_ATTRIBUTE_NORMAL = 128
blob btest
boolean lb_read
ulong lul_size, lul_read, lul_hfile
string as_file = 'C:\temp\edifact\TPTASS_L0_201512_P000778899_ASS0012345_20151218_001.xml'
lul_size = FileLength(as_file)
btest = blob_alloc(lul_size)

lul_hfile = CreateFile (as_file, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
lb_read = readfile(lul_hfile, btest, lul_size, lul_read /*bytes*/, 0)
closehandle(lul_hfile)

messagebox("blob", len(btest))

The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#6 21-12-2015 16:00:10

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU]crash lors de la lecture d'un gros fichier texte

seki a écrit:

Je comptais chercher une solution sans devoir passer par l'api windows, mais je vais quand même essayer.

La solution qui fonctionne sans planter, c'est de sous-traiter la validation à un bout de Perl et LibXML : on lui passe le chemin vers le fichier et le schéma, et on récupère la liste des erreurs éventuelles.


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#7 21-12-2015 16:15:30

bewan  
Membre
Date d'inscription: 15-03-2012
Messages: 17
Pépites: 86
Banque: 0

Re: [RESOLU]crash lors de la lecture d'un gros fichier texte

Les applications 32 bits sont limitées à 2GB de mémoire,  mais via un petit outils on peut aller jusqu'a 3GB , voir ici https://scn.sap.com/thread/3425191
Peut être que cela résoudra votre problème de mémoire.

Hors ligne

 

#8 24-12-2015 11:10:36

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU]crash lors de la lecture d'un gros fichier texte

J'ai découvert cet outil il y a peu, mais le problème n'est pas là : ~380 Mo (application) + ~120 Mo (fichier qu'on essaie de charger) ça reste bien inférieur à 2 Go.

Pas grave je m'en suis tiré avec du Perl


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#9 24-12-2015 11:20:38

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU]crash lors de la lecture d'un gros fichier texte

Et je n'arrive pas à ajouter le [RESOLU], en fait je n'arrive plus à modifier de message pour cause HTTP_REFFERER incorrect


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22