violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 2010
-
13 avril 2007 à 16:21
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 2014
-
16 avril 2007 à 07:44
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
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 13 avril 2007 à 22:23
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...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 13 avril 2007 à 23:03
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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 14 avril 2007 à 12:35
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.
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 15 avril 2007 à 16:16
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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 15 avril 2007 à 19:10
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.