cs_PROGRAMMIX
Messages postés1133Date d'inscriptionmercredi 2 octobre 2002StatutMembreDernière intervention24 juillet 2011
-
17 févr. 2008 à 14:38
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 2018
-
23 févr. 2008 à 18:14
Bonjour,
Le projet sur lequel je travailler actuellement implique le chargement d'un fichier de 134 Ko contenant 2.283 lignes de 23 à 120 caractères.
Lorsque je charge ce fichier pour l'afficher, j'observe un ralentissement du chargement au fur et à mesure.
Pourriez-vous me dire comment éviter cela ?
Ci-dessous le code utilisé :
Private Sub cmdChargerFichier_Click()
Dim numFichier As Integer
Dim s1 As String
Dim s2 As String
Dim S As String
Dim f As String
Dim i As Integer
Dim Param() As String
Dim NbreSemaines As Integer
Dim NbreLignes As Integer
Dim iSemaine As Integer
Dim x1 As Integer
numFichier = FreeFile
x1 = 1
'Ouverture du fichier source
Open FichierSource For Input As #numFichier
'Ligne 1 = NbreSemaines, NbreLignes, NomEquipe, FichierModèle
Line Input #numFichier, s1
'Ligne 2 = Séparation des groupes
Line Input #numFichier, s2
'Lecture de la suite
While Not EOF(numFichier)
'Incrémente la variable iSemaine
iSemaine = iSemaine + 1
'Charge les dates
Line Input #numFichier, S
f = f & S & vbCrLf
'Idem pour la ligne des remarques
Line Input #numFichier, S
f = f & S & vbCrLf
'Idem pour les lignes contenant les horaires
For i = 1 To NbreLignes
Line Input #numFichier, SIf (i x1) Or (i x1 + 1) Then S = "==>" & S
f = f & S & vbCrLf
Next
'Rend la main à Windows
Me.Label1.Caption = "Semaine " & iSemaine & "/" & NbreSemaines
DoEvents
Wend
'Fermeture du fichier source
Close #numFichier
Me.Text1.Text = s1 & vbCrLf & s2
Me.RichTextBox1.Text = f
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 17 févr. 2008 à 19:10
ReDim tBuff.saArr(500) ' <strike>Déclaration d'un</strike>initialisation/dimension de départ du tableau de 500 éléments
le reste est bon.
il est plus rapide de remplir une variable que de concaténer et donc de redimensionner la taille de la variable
on ne fait donc QUE du remplissage (tableau), ensuite en redimensionne à la taille exacte (d'où le compteur) et on récupère le tout concaténé une seule fois par JOIN
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 17 févr. 2008 à 15:04
salut,
peux-tu héberger le fichier texte?
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
cs_PROGRAMMIX
Messages postés1133Date d'inscriptionmercredi 2 octobre 2002StatutMembreDernière intervention24 juillet 20112 17 févr. 2008 à 15:30
Le problème vient certainement de l'utilisation de la variable "f as string" qui me sert à recueillier les données.
Si je mets toutes les lignes faisant appel à cette variable, le processus s'exécute à la "vitesse de l'éclair" à tel point que je n'ai pas le temps d'observer un ralentissement.
Seulement voilà, comment utiliser au mieux cette variable ?
ou quelle autre type de variable est-il préférable d'utiliser pour un tel cas de figure ?
Programmix
Vous n’avez pas trouvé la réponse que vous recherchez ?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 17 févr. 2008 à 15:41
c'est pas que c'est plus long vers la fin, c'est qu'on passe plus souvent dans ta boucle avec "==>"
par contre à part justement cet ajout, j'ai du mal à comprendre l'intérêt de ce travail sur le fichier.
je peux t'aider à l'optimiser un peu mais il faudrait plus d'explications (??)
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
cs_PROGRAMMIX
Messages postés1133Date d'inscriptionmercredi 2 octobre 2002StatutMembreDernière intervention24 juillet 20112 17 févr. 2008 à 15:53
Ce fichier est un fichier utilisé pour gérer les horaires de 19 personnes sur une année.
Chaque paire de ligne correspond à l'horaire d'un titulaire dont le nom est repris dans la première ligne et, en cas de remplacement du titulaire par une autre personne, le nom de ce remplaçant est indiqué dans la seconde ligne.
Seulement voilà, je dois réécrire le fichier parce que l'un des titulaires ayant obtenu un mi-temps, je dois "ré-injecté" son remplaçant dans le planning en tant que "nouveau titulaire" sans pour autant augmenter le nombre de "titulaires prévus" (caractérisé par la variable "nbrelignes").
Le code présenté n'était que la première partie du projet, celle chargeant de le fichier de base qui sera modifié en fonction de ce que je viens d'expliquer (j'espère assez clairement).
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 17 févr. 2008 à 16:02
bin moyen mais bon ^^
voici strictement le même code, avec un tableau
çà semble plus rapide :p
Option Explicit
Private Const FichierSource As String = "C:\horaires2008.txt"
Private Type BUFFER
saArr() As String
lCpt As Long
End Type
Dim tBuff As BUFFER
Private Sub cmdChargerFichier_Click()
'
buffer
ReDim tBuff.saArr(500)
tBuff.lCpt = -1
Dim FF As Integer
Dim s1 As String
Dim s2 As String
Dim S As String
Dim i As Integer
Dim Param() As String
Dim NbreSemaines As Integer
Dim NbreLignes As Integer
Dim iSemaine As Integer
Dim x1 As Integer
x1 = 1
FF = FreeFile
'Ouverture du fichier source
Open FichierSource For Input As #FF
'Ligne 2 = Séparation des groupes
Line Input #FF, s2
'Lecture de la
suite
While Not EOF(FF)
'Incrémente la variable iSemaine
iSemaine = iSemaine + 1
'Charge les
dates
Line Input #FF, S
Add S & vbCrLf
'Idem
pour la ligne des remarques
Line Input #FF, S
Add S & vbCrLf
'Idem pour les lignes contenant les
horaires
For i = 1 To NbreLignes
Line Input #FF, S
If (i = x1) Or (i = x1 + 1) Then S =
"==>" & S
Add S & vbCrLf
Next i
'Rend la main à Windows
Me.Label1.Caption = "Semaine
" & iSemaine & "/" & NbreSemaines
DoEvents
Wend
Private Sub Add(ByVal sVal As String)
With tBuff
.lCpt = .lCpt + 1
If .lCpt > UBound(.saArr) Then ReDim Preserve
.saArr(.lCpt + 500)
.saArr(.lCpt) = sVal
End With
End Sub
(ps : de mémoire Renfield et Violent_Ken ont fait des classes de ce genre)
++
<hr size ="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
cs_PROGRAMMIX
Messages postés1133Date d'inscriptionmercredi 2 octobre 2002StatutMembreDernière intervention24 juillet 20112 17 févr. 2008 à 18:37
Merci, c'est effectivement plus rapide.
Mais histoire que je comprenne bien le fonctionnement, peux-tu vérifier mes commentaires ci-dessous ?
Et éventuellement m'expliquer, à moins que ce ne soit pas explicable en "français simple", pourquoi cette méthode fonctionne mieux que l'autre ?
Je pense aussi que Renfield a déjà élaboré des classes pour gérer cela, mais, à mon grand regret, j'ai encore beaucoup de mal à saisir toutes les subtibilités d'utilisation des classes pour une optimisation du code.
'Déclaration d'un type de variable
Private Type
BUFFER
saArr() As String 'Tableau de chaines
lCpt As Long 'Index d'une chaine
End Type
Dim tBuff As BUFFER
'(...)
ReDim tBuff.saArr(500) ' Déclaration d'un tableau de 500 éléments
tBuff.lCpt = -1 'Index de départ
'(..)
'Fonction pour ajouter une chaine dans le tableau
Private Sub Add(ByVal sVal As String)
With tBuff
.lCpt = .lCpt + 1 'Index de la chaîne ajoutée
'Si l'index est supérieur à sa limite maximale, le tableau est redimentionné avec conservation des éléments précédents
If .lCpt > UBound(.saArr) Then ReDim Preserve .saArr(.lCpt + 500)
'La chaîne est ajoutée au tableau
.saArr(.lCpt) = sVal
End With
End Sub
cs_PROGRAMMIX
Messages postés1133Date d'inscriptionmercredi 2 octobre 2002StatutMembreDernière intervention24 juillet 20112 23 févr. 2008 à 17:55
Je voudrais remercier une nouvelle fois PCPT.
Grâce à sa suggestion, j'ai pû accélérer le chargement des fichiers dans mon programme de "gestion" d'horaires.
En effet, dans mon projet initial, je redimensionnais mon tableau de données au fur et à mesure du chargement du fichier avec Redim Preserve et ce, malgré le fait que le nombre d'éléments à placer dans ce tableau est connu dès l'ouverture du fichier.
J'ai donc modifié mon code pour définir la taille du tableau dès l'ouverture du fichier.