jboss38
Messages postés829Date d'inscriptionsamedi 4 octobre 2008StatutMembreDernière intervention14 décembre 2016
-
15 mai 2016 à 16:05
jboss38
Messages postés829Date d'inscriptionsamedi 4 octobre 2008StatutMembreDernière intervention14 décembre 2016
-
17 mai 2016 à 21:15
Bonjour,
Je développe un petit bout de code qui permet de lire un ficher byte par byte puis de l’écrire dans un nouveau fichier créé préalablement.
Je voulais savoir si je pouvais optimiser ce code pour que le traitement soit plus rapide, en effet il faut bien 5 minutes au-delà de 20Mo de fichier.
Voici mon bout de code:
Using file As New IO.FileStream(SrcFile, IO.FileMode.Open) Using fileCrpt As New IO.FileStream(cryptName, IO.FileMode.Open) For i As Integer = 0 To dataArray.Length - 1 dataArray(i) = file.ReadByte() HexResult = dataArray(i).ToString("X2") cryptHex = crypt(HexResult) fileCrpt.WriteByte(CByte(Conversion.Val("&H" & cryptHex))) EndOfCryptBar.Value = i Next i
End Using End Using
Comme vous l'avez vu il y a une conversion mais cela n'affecte pas la durée, j'ai essayé sans c'est pareil.
Voilà j’espère que vous pourrez m'aider à optimiser ce code (si c'est possible)
Ce qui me prend beaucoup de ressources c'est le tableau dataArray qui prend la même taille que le fichier source j'ai essayé de la purger au fur et à mesure mais je n'y arrive pas, je mets juste la valeur du tableau en empty.
( dataArray(i - 1) = vbEmpty )
Ok j'ai gagner un peu de vitesse, c'était a cause de mon comptage I.
J'ai fait autrement c'est beaucoup plus rapide, mais je sens que ce n'est pas encore la meilleur façon de faire !
Je fais par paquet de 4096 bytes de tableau
Do Until file.Position >= file.Length If FilesrcLen < 4095 Then DataLeng = FilesrcLen - 1 Else DataLeng = "4095" FilesrcLen = FilesrcLen - 4096 End If Dim dataArray(DataLeng) As Byte For i As Integer = 0 To dataArray.Length - 1 dataArray(i) = file.ReadByte() HexResult = dataArray(i).ToString("X2") cryptHex = crypt(HexResult) fileCrpt.WriteByte(CByte(Conversion.Val("&H" & cryptHex))) 'vCount = vCount + 1 Next i EndOfCryptBar.Value = file.Position Loop
Membre
NHenry
Messages postés15069Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention29 mai 2023158 15 mai 2016 à 23:45
A la place de lire octet par octet, charge toute une partie du fichier (fonctions Reab et Write).
De plus, une perte de temps peut se passer dans ton fonction de chiffrement.
Malheureusement ma fonction de cryptage ce fait Octet par Octet.
Je vais donc regarde ce que je peux faire.
jboss38
>
NHenry
Messages postés15069Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention29 mai 2023 16 mai 2016 à 10:30
Du coup, est-ce que tu pensais a qqc comme ça :
Do Until file.Position >= file.Length If FilesrcLen < 4095 Then DataLeng = FilesrcLen - 1 Else DataLeng = "4095" FilesrcLen = FilesrcLen - 4096 End If Dim dataArray(DataLeng) As Byte cryptHex = "" For i As Integer = 0 To dataArray.Length - 1 dataArray(i) = file.ReadByte() HexResult = dataArray(i).ToString("X2") cryptHex = cryptHex + crypt(HexResult) 'vCount = vCount + 1 Next i fileCrpt.WriteByte(CByte(Conversion.Val("&H" & cryptHex))) EndOfCryptBar.Value = file.Position Loop
Le code lit chaque octet mais écrit tous les 4096 octet
NHenry
Messages postés15069Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention29 mai 2023158
>
jboss38
16 mai 2016 à 12:22
vb95
Messages postés3418Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention31 mai 2023165
>
jboss38
Modifié par vb95 le 16/05/2016 à 17:18
soit un fichier de 8192 octets
un tableau de 4096 octets par exemple
tu lis 4096 octets d'un seul coup avec Read(tableau,offset,nombreoctets)
ton cryptage tu le fais sur le tableau directement et non sur la lecture de chaque octet
tu fais le traitement 2 fois par une boucle
si le fichier fait 8194 octets par exemple un
8194 Mod 4096
te donne 2 comme résultat
donc en fin de tes 2 boucles de 8192 tu sais qu'il te reste encore 2 octets à traiter ( tout cela pour t'expliquer comment déduire si il faut une dernière boucle pour les derniers octets et le nombre de ces derniers octets à traiter) . si l'opération Mod donne 0 comme résultat il n'y a pas de dernière boucle supplémentaire vu que la taille du fichier est un multiple de la taille du tableau
De plus Val est une instruction VB6 gardé par compatibilité : son équivalent net est bien plus performant : Convert.ToByte pour un octet ( voir ton aide VB Net pour cela