Page 1 sur 1
[R] améliorer la vitesse dexécution d'un script
Posté : ven. 18 mars 2011 11:04
par steiner62
Bonjour à tous,
je suis face a un problème délicat j'ai la solution a mon problème initial mais le temps d'exécution de mon script est tellement long que je ne peut pas me permettre de le concidérer comme terminer.
Problèmatique :
Je doit faire un traitement de deux fichiers de taille différente (premier fichier de 355Ko et le second de 6 115Ko) mais de structure identique. Le traitement a effectuer est de lire le fichier, trouver toute les lignes contenant les valeur comprise entre 40100001 et 40199999 et comprise entre 41100001 et 41199999 pour y ajouter à la fin selon le fichier traité une lettre V pour le petit fichier ou M pour le plus gros.
Hors il s'avére que le traitement du plus petit fichier met beaucoup plus de 30 minutes. Le petit fichier contient quand même plus de 86.000 lignes et le plus gros plus de 3.000.000 de lignes. Et je ne peut absolument pas supprimer les retours à la ligne.
Les fichiers :
Voici la structure des fichiers :
Code : Tout sélectionner
#FLG 000
#VER 14
#DEV EUR
#MECG
03
031110
211210
1
100001
4110000
51125000
41136557
WEINBRECK BERNARD
2
4118,69
0,000000
0,00
0
1
166,91
A
0
0
0
0
0
0
0
0,00
#MECG
Mes scripts :
La version 1 du script :
► Afficher le texte
Code : Tout sélectionner
#include <file.au3>
#include <string.au3>
;---------------------------
;Nom des fichiers à traiter
$fichierVDA = 'test.txt'
$fichierMARCQ = 'EXPMARCQ.txt'
;---------------------------
; Etape 1 traitement fichierVDA
$file = FileOpen($fichierVDA, 0)
$read = FileRead($file)
$line = StringSplit($read, @CR)
For $i = 1 To $line[0]
$var = FileReadLine($file, $i)
;MsgBox(1,"résultat Entree",$var)
$ctrl = StringIsXDigit($var)
if $var >= '40100001' And $var <= '40199999' And $ctrl == 1 Or $var >= "41100001" AND $var <= "41199999" And $ctrl == 1 Then
$sortie=StringRegExpReplace($var,$var,$var & "V")
Filewrite("IMPORT_VDA.txt", $sortie & @CRLF)
;MsgBox(1,"résultat sortie",$sortie)
Else
Filewrite("IMPORT_VDA.txt", $var & @CRLF)
Endif
Next
FileClose($fichierVDA)
Exit
Ou tout est géré en même temps il lit le fichier d'origine et réécrit dans un fichier de destination.
La version 2 du script :
► Afficher le texte
Code : Tout sélectionner
#include <file.au3>
#include <string.au3>
#include <Array.au3>
;---------------------------
;Nom des fichiers à traiter
$fichierVDA = 'test.txt'
$fichierMARCQ = 'EXPMARCQ.txt'
$dest = 'SAUVE'
;---------------------------
FileCopy($fichierVDA,$dest,1)
$fin = _FileCountLines($fichierVDA)
MsgBox(1,"","Nombre de ligne : "&$fin)
Dim $array[1]=["LIGNE"]
Dim $colonearray[1]=["COLONNE"]
$x=1
for $i = 1 to $fin
$var = FileReadLine($fichierVDA, $i)
$ctrl = StringIsXDigit($var)
if $var >= '40100001' And $var <= '40199999' And $ctrl == 1 Or $var >= "41100001" And $var <= "41199999" And $ctrl == 1 Then
;MsgBox(1,"array","valeur $x : " & $x)
ReDim $array[$x]
ReDim $colonearray[$x]
_ArrayInsert($array,$x,$i) ;ajout dans tableau du N° ligne a modifier
_ArrayInsert($colonearray,$x,$var) ;ajout dans tableau de la valeur a modifier
;MsgBox(1,"Traitement ","Traitement terminé à " &$array[0]&" seconde valeur "& $array[$x])
;MsgBox(1,"Traitement ","Traitement terminé à " &$colonearray[0]&" seconde valeur "& $colonearray[$x])
$x=$x+1
Msgbox(1,"ligne","Ligne traitée : "&$i,2)
EndIf
Next
MsgBox(1,"Fin recherche","le traitement de recherche des valeur a modifier est terminé"&@CRLF&"Lancement du traitement de modification")
For $modif = 1 to $array[0]
_FileWriteToLine($fichierVDA,$array[$modif],$colonearray[$modif] & "V",1)
next
$H= FileGetTime($fichierVDA,0,1)
MsgBox(1,"Traitement ","Traitement est terminé à " &$H)
Exit
Où la je travaille avec des array en espérent augmenter la vitesse mais ce n'ai pas mieux.
Comment puis je faire pour améliorer la vitesse d'exécution de ceci ? car si je met plus de 30 minutes pour le petit fichier je n'ose imaginer le temps pour le plus gros.
merci de votre aide.
Re: [..] améliorer la vitesse dexécution d'un script
Posté : ven. 18 mars 2011 12:05
par matwachich
Re: [..] améliorer la vitesse dexécution d'un script
Posté : ven. 18 mars 2011 12:19
par softwater
bonjour,
Je suis pas sûr d'avoir tout compris...
Voici ce que j'ai fait,
- Lecture du fichier ligne par ligne
ouverture d'un fichier de réception
réécrit chaque ligne dans le nouveau fichier
si la valeur est trouvée ajoute V
► Afficher le texte
Code : Tout sélectionner
$file = FileOpen("IMPORT_VDA.txt", 0) ; ouverture du fichier d'origine en lecture
; Check if file opened for reading OK
If $file = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
$fileNew = FileOpen("IMPORT_VDA_new.txt", 2 + 8) ; création du fichier de destination
If $fileNew = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
While 1
$var = FileReadLine($file) ; Read in lines of text until the EOF is reached
If @error = -1 Then
ExitLoop
EndIf
If ($var >= 41100001 And $var <= 41199999) Or ($var >= 40100001 And $var <= 40199999) Then ; si une ligne une valeur dans les plages définies...
MsgBox(1, "résultat Entree", $var)
$var=$var & "V" ; ....ajoute un V à la fin de la valeur
EndIf
FileWriteLine($fileNew, $var) ; écrit chaque ligne du fichier d'origine dans le fichier de destination
WEnd
FileClose($file)
FileClose($fileNew)
Re: [..] améliorer la vitesse dexécution d'un script
Posté : ven. 18 mars 2011 12:40
par matwachich
Voila, c'est ça.
Dans le script du premier post vous n'utilisiez pas FileOpen, et si on regarde bien la doc de la fonction FileReadLine:
Code : Tout sélectionner
If a filename is given rather than a file handle - the file will be opened and closed during the function call - for parsing large text files this will be much slower than using filehandles.
Dans les gros fichiers, il faut toujours utiliser des handles.
Perso, j'utiliserai plutôt _FileReadToArray, car il est encore plus rapide de traiter un Array (car il est en mémoire) qu'un fichier même en handle!
► Afficher le texte
Code : Tout sélectionner
#include <File.au3>
Global $aFile
_FileReadToArray("IMPORT_VDA.txt", $aFile)
If Not IsArray($aFile) Then Exit -1
For $i = 1 To $aFile[0]
If ($aFile[$i] >= 41100001 And $aFile[$i] <= 41199999) Or ($aFile[$i] >= 40100001 And $aFile[$i] <= 40199999) Then
$aFile[$i] = $aFile[$i] & "V"
EndIf
Next
_FileWriteFromArray("IMPORT_VDA_new.txt", $aFile, 1)
Re: [..] améliorer la vitesse dexécution d'un script
Posté : sam. 19 mars 2011 03:36
par SagePourpre
Aussi, en changeant la priorité du script
à haute (4) ou temps réel(5)...
Re: [..] améliorer la vitesse dexécution d'un script
Posté : lun. 21 mars 2011 09:08
par steiner62
J'ai honte en lisant vos réponses s'était tellement évident que je n'ai pas vu mon erreur de débutant.
Grand merci de votre aide