2 votes

La création des grandes cordes prend beaucoup de temps

J'ai un programme qui charge les bits d'un fichier dans un tableau hexadécimal, la longueur résultante du tableau est de 16 777 216. J'effectue quelques modifications rapides sur le tableau, le convertit en une chaîne de caractères géante (la longueur est de 33 554 432) afin qu'il puisse être reconverti en un tableau d'octets et écrit dans un nouveau fichier enfin, j'essaye.

Le problème est que la chaîne met une éternité à être créée, même après quelques minutes d'attente (ce qui est tout ce que j'attendrais). Je ne pense pas qu'il y ait une meilleure façon de configurer cette chaîne comme je l'ai actuellement, mais y a-t-il un moyen d'accomplir cela en gardant le tableau hexagonal tel quel ? Ou existe-t-il un moyen simple de ne modifier que les offsets dont j'ai besoin sans réécrire l'ensemble du fichier ?

 Dim tHex As String = ""
 For i = 0 To gloBytes.Length - 1
     tHex &= gloBytes(i)
 Next

Merci pour votre aide.

5voto

Reed Copsey Points 315315

Si vous avez l'intention d'effectuer de nombreuses manipulations sur une chaîne de caractères, vous devriez utiliser un fichier StringBuilder au lieu de l'annexer directement au String .

Desde System.String est immuable, chaque fois que vous faites tHex &= gloBytes(i) vous créez une chaîne entièrement nouvelle. Cela provoque une énorme quantité de rotation de la mémoire, et met beaucoup de pression sur la GC, ce qui à son tour rend l'ensemble très lent.

StringBuilder En effet, il s'agit d'une classe mutable conçue spécifiquement pour permettre d'effectuer de multiples opérations, puis de les convertir en chaîne de caractères (via la commande ToString() ) une fois à la fin.

Le code équivalent utilisant StringBuilder serait :

Dim tmp as New StringBuilder(gloBytes.Length * 2)
For i = 0 To gloBytes.Length - 1
    tmp.Append(gloBytes(i))
Next
Dim tHex As String = tmp.ToString()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X