Concatener une chaine de quelques Mo

[Résolu]
Signaler
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
-
Violent Ken
Salut à tous.
Dans le cadre d'une opération de sanitization d'un disque dur, j'aurais eu besoin de créer un buffer de plusieurs Mo complètement aléatoire (chaque caractère de la string doit être aléatoire entre &H00 et &HFF)

Je dois donc faire une énorme concaténation de plusieurs millions de caractères.
J'ai par exemple çà pour le moment :

           For y = 1 To curPos2 - curPos1 + 1
               z = Int(Rnd * l1) + l2
               s = s & Chr$(z)
               If (y Mod 500) = 0 Then DoEvents  'rend la main de tps en tps
           Next y, ----
By Renfield
Bon, bien évidemment, si je concatene 2 millions (pour 2Mo) de caractères comme çà, je vais mettre 10 ans...

Rien que pour 100000 caractères (buffer de 100Ko) sans DoEvents et sans Random (concaténation triviale de "0") :

Option Explicit

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Sub Command1_Click()
Dim s As String
Dim x As Long
Dim lTim As Long

   lTim = GetTickCount
   s = vbNullString
   
   For x = 1 To 100000
       s = s & "0"
   Next x
   
   Me.Caption = CStr(GetTickCount - lTim)

End Sub , ----
By Renfield
je met déjà 3.5 secondes.... alors avec du DoEvents, avec du Random et 2M caractères, c'est mort !

Evidemment, en subdivisant mes opérations de concaténation, je gagne ENORMEMENT de temps :

Option Explicit

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Sub Command1_Click()
Dim s(100) As String
Dim y As Long
Dim s2 As String
Dim x As Long
Dim lTim As Long

   lTim = GetTickCount
   s2 = vbNullString
   
   For y = 1 To 100
       s(y) = vbNullString
       For x = 1 To 1000
           s(y) = s(y) & "0"
       Next x
       s2 = s2 & s(y)
   Next y
   
   Me.Caption = CStr(GetTickCount - lTim) & "  " & CStr(Len(s2))

End Sub , ----
By Renfield
ne met plus que 0.1 seconde.
Ce n'est malheureusement pas suffisant...

Quelqu'un aurait une idée pour optimiser la chose ?
Merci, @+

Hex Editor VB

39 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
OUPS, attention de tester si retour de bnAlloc2MoAlea() <> 0 avant de t'en servir, mémoire peut très bien manquer, on ne sait jamais. En ce cas, ne surtout pas envoyer à bnFreeAlloc(), je ne teste rien, développeur présupposé responsable...

ciao...
BruNews, MVP VC++
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken

Ok, j'ai bien compris et j'ai téléchargé le fichier. Je teste çà. Merci bien !
@+







Hex Editor VB
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken
Hum, j'ai une violation d'accès causé par la *.dll lors de l'appel de bnAlloc2MoAlea.
@+

Hex Editor VB
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
oh faut que je teste, je ferai un truc en VBA dans Excel.
J'essaie de régler ça pour demain.

Fais voir tes Declare.

ciao...
BruNews, MVP VC++
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken


Private Declare Sub bnFreeAlloc Lib "bnAlloc.dll" (ByVal pmem As Long)
Private Declare Function bnAlloc2MoAlea Lib "bnAlloc.dll" () As Long

,

----

Hex Editor VB
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Semble bon, je vois cela au plus tôt.

ciao...
BruNews, MVP VC++
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken
Ok, merci bien, @+

Hex Editor VB
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Trop drole, je plaque 16 octets (4 valeurs alea par tour de boucle) sauf que j'ai oublié de diviser le count.
Parler à bobonne et à Nix en écrivant l'asm, pas bon du tout.

Je ecompile de suite.

ciao...
BruNews, MVP VC++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Allez, tu peux reprendre et tester.

ciao...
BruNews, MVP VC++
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken
Parfait : çà marche nickel et c'est quasi instantané... c'est TRES impressionant !

Par contre j'ai eu la curiosité de tester la fréquence d'apparition des bytes avec mon logiciel : http://www.enregistrersous.com/images/28975054420070413231818.jpg

Pas tout à fait pseudo-aléatoire donc, mais qu'importe, c'est nickel quand même ;)

Merci encore, @+

Hex Editor VB
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
ah je look, je peux changer l'alea... mais cette fois pas avant demain.


Faudra que je fasse un affichage dans Exce pour vérifier les valeurs.

ciao...
BruNews, MVP VC++
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken
Ok comme tu veux, mais ne te prend pas trop la tête avec çà, c'est déjà vraiment très bien comme çà ;)

Merci encore, @+

Hex Editor VB
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Tu peux reprendre le zip, algo aléatoire refait.
J'ai joint un exe de test qui contient la routine complète de la dll, double clic dessus. Il te crée alea.txt qui affiche les 500 premiers DWORDs, tu ouvres avec Excel pour trier en croissant et tu verras que très difficile de trouver un doublon.

ciao...
BruNews, MVP VC++
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken
Effectivement ! La fréquence d'apparition des char est vraiment aléatoire !

Merci encore, @+

Hex Editor VB
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken
Salut, c'était juste pour dire que j'ai terminé mon accessoire de sanitization de disque dur...

C'est assez efficace, EasyRecovery ne parvient à récupérer aucun fichier du disque... même avec les outils les plus avancés du logiciel.

J'hésite à poster cette source car c'est quand même bien dangereux... enfin bon, merci à tout le monde, Brunews pour la dll et son source, et les autres pour leurs (précieuses) infos sur la sanitization.

@+

Hex Editor VB
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken
Bon, j'ai finalement déposé la source...
@+

Hex Editor VB
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Merci Violent, pour ce dépôt.

Lorsque mes filles (qui me bouffent mon temps en ce moment) me laisseront un peu plus de temps disponible, je t'exposerai par MP une autre méthode qui, elle, joue avec une fragmentation forcée presque au tout début (ce n'est pas mal du tout) avant l'écriture en plusieurs passes de quelques 3 ou 4 (pas plus) fichiers volumineux, choisis dans un ordre aléatoire.
Mais j'ai bien compris que le mécanisme que tu as mis en oeuvre t'était imposé et que tu n'avais pas le choix, donc....
C'est la raison pour laquelle je n'ai pas fait allusion à cette méthode.
A plus, donc.
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken


Salut, c'est très gentil de ta part ! Si la méthode est codable en VB6 sans trop de difficultés, je l'inclurai également dans ma source.

Merci, @+
Hex Editor VB
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Bonjour; Violent,

Oui, elle est codable en VB
Mais non, elle ne sera pas à inclure dans ta source car totalement différente
A +