Amelioration de la vitesse d'enregistrement en ADO

metalcoder Messages postés 193 Date d'inscription jeudi 14 février 2002 Statut Membre Dernière intervention 25 mars 2011 - 21 juil. 2005 à 14:47
Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 - 21 juil. 2005 à 22:30
Bonjour a tous,

je vous explique mon soucis

j'ai commencer un logiciel pour sauvegarder tous mes CD,DVD de données et autres afin de retrouver rapidement un logiciel ou un fichier.
Je sauvegarde absolument tout dans un fichier Access.

Mon probleme est que je trouve ca tres lent.

Par ex : avec ma clé usb de 128 mo, lorsque je procede a sa lecture mais sans enregistrer ca me prends environ 3sec. Mais si j'enregistre je passe tout de suite à plus de 1min

Imaginer pour un disque dur de 80 Go

Ma fonction de recherche de fichier sans enregistrement n'est pas la plus rapide mais pour un disque de 10 Go plein de petit fichiers je met environ 40 sec. Ce qui me parait quand meme correcte

Voici un morceau de mon code ADO que je fait appel a chaque fois que je trouve un fichier

Set rc = New ADODB.Recordset
rc.Open "Record", Ct, adOpenForwardOnly, adModeWrite
rc.AddNew
rc!idx_path=path
rc!Fichier = Fichier
rc!SerialNumber = numserie
If label "" Then label " "
rc!VolumeName = label
rc!nomsimple = nomsimple
rc!Taille = Taille_Fichier & " Ko"
rc.Update
rc.MoveNext

J'aimerais savoir si il existe une methode pour mettre en cache les infos et les ecrire a la fin de la procedure en une seule fois ou un autre moyen d'acceler le traitement.

Merci

3 réponses

cs_David_wklw Messages postés 48 Date d'inscription samedi 18 novembre 2000 Statut Membre Dernière intervention 24 mars 2006
21 juil. 2005 à 15:15
Hello,


J'avais ce morceau de code trouvé sur le web... de là à dire que cela va plus vite...



Function FileExistDir(strDir As String, _
strTable As String, strField As String)



Dim intFile As Integer
Dim strFile As String


intFile 0: strFile ""


With Application.FileSearch .LookIn strDir: .FileName "*.*"
If .execute > 0 Then
For intFile = 1 To .FoundFiles.Count
strFile = .FoundFiles(intFile)
strFile = Right(strFile, Len(strFile) - (Len(strDir) + 1))
CurrentDb.execute "INSERT INTO [" & strTable & "] " _
& "([" & strField & "])" _
& "SELECT """ & strFile & """ ;"
Next
End If
End With


End Function
0
metalcoder Messages postés 193 Date d'inscription jeudi 14 février 2002 Statut Membre Dernière intervention 25 mars 2011 1
21 juil. 2005 à 16:47
Bon j'ai réussi a avoir quasiment la meme chose avec et sans enregistrement.

En faite je fait appel une fois a rc.open
ensuite je vais dans ma procedure de recherche puis la sauvegarde mais la je fait que addnew sans faire de update, ou de close
et une fois que tout est scannée je fais un updatebatch

Set rc = New ADODB.Recordset
rc.Open "Record", Ct, adOpenForwardOnly, adModeWrite
rc.CacheSize = 1000

MAFONCTION RECHERCHE RECURSIVE
SAUVEGARDE BASE

rc.UpdateBatch
rc.Close

Je scanne ma clé USB en 4 sec et mon disque de 10 Go plein de petits fichiers en 1 min. Cool

@++
0
Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 9
21 juil. 2005 à 22:30
Salut,



lorsque tu manipules souvent un objet, il vaut mieux employer







With Obj

...

End With





Pour une boucle, mieux vaut stocker le nb d'element obtenu par une
fonction .Count. Sinon, vous faite appel à .Count à chaque tour de
boucle ...



Dim max as Integer

max = ListeBox.Count

for i=1 To max

...



voir entre autre http://www.vbfrance.com/code.aspx?id=8198


++

Zlub
0