COMPACTAGE BDD AVEC JETCOMP

Chatbour Messages postés 71 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 12 juillet 2009 - 4 sept. 2007 à 19:55
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 5 sept. 2007 à 19:12
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43977-compactage-bdd-avec-jetcomp

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 sept. 2007 à 19:12
Très clair que ça n'influe pas sur le principe de l'exemple.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
5 sept. 2007 à 18:57
pour l'exemple vaut mieux alors passer par une variable intermédiaire OK

le problème ne se serait pas posé si j'avais commencé le tableau à 1 en mettant "data_bidon" en boucle dans le load.

ce qui est important ici est évidemment le principe! en l'uccorence l'utilisation de mid dans l'espace déjà créé.

du reste on s'aperçoit au moins que malgré le manque d'optimisation de l'exemple, la différence des 2 méthode reste énorme ;)

bref pour une base çà nous rapelle donc le compromis qu'il peut falloir faire entre taille (de la base) et rapidité (d'écriture)

++ ;)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 sept. 2007 à 18:17
Ui=Ui+iLen
devrait normalement couter 1 cycle, absolument imbattable.

((((i - LB) + 1) * iLen) + 1 - iLen)
ici approximativement 12 cycles.
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
5 sept. 2007 à 15:26
@BOUV: Question de gout?, humm je dirais y'a même pas photo, hé ben faut pas dire des bétises.
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
5 sept. 2007 à 14:41
ASIMENGO>>Je crois que c'est une question de goût tout ça. Chacun ses préférences. Perso je préfère le code de PCPT pour les raisons suivantes :

- Plus concis
- Ne passe pas par la variable Ui ce qui peut faire gagner quelques précieux cycles.

++
Bouv
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
5 sept. 2007 à 14:05
@PCPT: je trouve toujours un peu lourd d'écrire des codes du genre de ta méthode rapide. L'utilisation des suites facilitent grandement la compréhension et même accélère également l'exécution. Je sais que c'était juste pour faire un aperçu mais c'est quand même pas une bonne habitude pour ceux qui lisent ça.

Voila, je la réecris comme il se doit.

Sub methode_rapide(ByRef r As String)
Dim i As Long, iLen As Integer, Ui as long
iLen = Len(a(LB))
r = String(((UB - LB + 1) * iLen), " ")
Ui=1: Mid$(r, Ui, iLen) = a(LB)

For i = LB +1 To UB
Ui=Ui+iLen: Mid$(r, Ui,iLen) = a(i)
Next i
End Sub

C'est bien pour compréhensible et surtout plus rapide.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
4 sept. 2007 à 21:58
* échelle en seconde mais c'est pareil... ;)
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
4 sept. 2007 à 21:53
c'est le même principe avec des variables.

il est plus rapide d'écrire dans une allocation créée que de redimensionner à chaque écriture


voici un exemple plus ou moins comparable (principe pour les variables)


Option Explicit
Const LB As Integer = 1000
Const UB As Integer = 9000
Dim a(LB To UB) As String 'contiendra 4 caractères par item


Private Sub Form_Load()
Dim i As Long, t As Currency

' rempli le tableau
For i = LB To UB
a(i) = CStr(i)
Next i

' méthode longue
Dim r1 As String
t = Timer
Call methode_longue(r1)
Debug.Print "1> TEMPS : " & Timer - t & " ms"

DoEvents

' méthode rapide, en utilisant l'emplacement créé
Dim r2 As String
t = Timer
Call methode_rapide(r2)
Debug.Print "2> TEMPS : " & Timer - t & " ms"

Unload Me
End Sub

Sub methode_longue(ByRef r As String)
Dim i As Long
r = vbNullString
For i = LB To UB
r = r & a(i)
Next i
End Sub

Sub methode_rapide(ByRef r As String)
Dim i As Long, iLen As Integer
iLen = Len(a(LB))
r = String(((UB - LB + 1) * iLen), " ")
For i = LB To UB
Mid$(r, ((((i - LB) + 1) * iLen) + 1 - iLen), iLen) = a(i)
Next i
End Sub



++ ;)
Chatbour Messages postés 71 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 12 juillet 2009 10
4 sept. 2007 à 21:40
Merci chef !
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 sept. 2007 à 21:20
Suppression physique des places non occupées, se fait par réécriture complète.
Chatbour Messages postés 71 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 12 juillet 2009 10
4 sept. 2007 à 21:16
Merci pour les informations, mais je ne pige pas encore la tâche du compactage de la base de donnée :-/
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
4 sept. 2007 à 20:37
J'allais le dire...
Non je déconne mais c'est un bon résumé.
Peut être déjà un peu trop technique pour les néophytes mais faut bien progresser ;-)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 sept. 2007 à 20:13
Vaste sujet...

espace gaspillé, on va voir que ça dépend du point de vue, place disque ou performances.

Une BDD est faite pour croitre donc elle ne fait que marquer 'libres' les lignes supprimées mais ne resserre jamais les fichiers de données (suppression physique) par un appel SetEndOfFile(). Il est moins couteux (en perfs) d'écrire sur une place déjà attribuée sur le disque (réécriture) plutot qu'une écriture nouvelle car oblige le driver fichier à trouver des clusters libres, si non contigus il faut à chaque morceau écrire aussi le pointeur sur le prochain cluster.

Résumé rapide mais c'est le principe.
Chatbour Messages postés 71 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 12 juillet 2009 10
4 sept. 2007 à 19:55
Merci pour la source :)

en quoi consiste le compactage d'une base de donnée ?
c'est peut être éliminer l'espace gaspillé ?