|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : février 2008 Messages : 11 ![]() |
une base access 2000 accedée en DAO 3.6 augmente de taille de facon exagerée si vous augmenter la taille d'un champ long binary.
par exemple une base vide qui fait 136 ko au depart passe a 412436 ko avec un malheureux champ long binary de 80 ko !!! ce champ ayant éte genérer par 10000 boucles qui augmente a chaque passage le champ de 8 octets. Cette base passe a 216 ko apres compactage. ce probleme ne se pose pas avec une base access 97 sous DAO 3.51 !! un close du recordset n'arrange rien le seul moyen qu'acces utilise les "trous" est de redemarrer l'application A l'aide !! , je ne peut pas fermer mon application pour la compacter !! merci : exemple sous VB6: avec une table contenant un champ long binary "bin" Code :
|
||
|
|
00
|
|
|
#2 | |
|
En attente de confirmation mail
Inscription : février 2005 Messages : 1 731 ![]() |
Bonjour,
Citation:
(1) réserver de la place pour de futurs ajouts, par exemple en dimensionnant ton tableau en prévision du besoin et en complétant l'enregistrement avec une information sur la taille des données réellement "utiles" (par exemple un champ qui donne la taille). Ainsi le AppendChunk écraserait bien la même page de données (au lieu d'en créer une nouvelle et d'invalider la précédente). (2) utiliser un champ de type Binay permettant de stocker une valeur binaire dont la taille n'excèderait pas 255 octets. (mais apparemment tu veux aller jusqu'à 8*10000 octets) ============ L'exemple que tu donnes c'est bien JUSTE UN EXEMPLE, ou alors ça te sert vraiment ??? Parce que, à part pour faire des tests, je ne vois pas à quoi ça peut servir... ![]() Pour aider à comprendre ce qui ne va pas... En fait plusieurs AppendChunk entre Edit/Update ne pose pas de Pb. C'est la succession des Edit/Appendchunk/Update sur le même enregistrement qui ne convient pas. _ |
|
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 11 ![]() |
le simple fait de re ecrire le champ binaire sans en augmenter la taille, fait augmenter la taille de la base !
|
|
|
00
|
|
|
#4 |
|
En attente de confirmation mail
Inscription : février 2005 Messages : 1 731 ![]() |
Bon, je vais tester ton code, par curiosité...
_ |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 11 ![]() |
l'exemple provient d'une application reelle que j'ai simplifié a l'extreme pour exposé le probleme.
l' application tourne depuis 10 ans , mais depuis le passage au format access 2000, j'ai ce probleme. le client est obligé d' arreter la ligne de production pour relancer le programme !! |
|
|
00
|
|
|
#6 | ||
|
En attente de confirmation mail
Inscription : février 2005 Messages : 1 731 ![]() |
J'ai testé plein de trucs...
La solution 1 qui consiste à prédimensionner le champ Long Binary apporte une amélioration. Sans "prédimensionner" le champ bin, la taille de la BD passe de 16 Ko à plus de 450 Mo ! Effectivement, à la longue ça peut faire tomber ton serveur... Sans compter le temps de compactage. Si on "prédimensionne" le champ bin, la taille de la BD passe de 16 Ko à 96 Mo. Dans tous les cas, le compactage ramène la BD à 16 Mo. Donc, même en prédimensionnant, il y a encore du "déchet" ! Je te donne mon code: Code :
|
||
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 11 ![]() |
merci
|
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 11 ![]() |
la base augmente de 80 MO a chaque passage (80 mo =10000x8ko)
chaque fois que l'on reecrit les 8ko , on augmente la taille de la base de 8ko !! |
|
|
00
|
|
|
#9 |
|
En attente de confirmation mail
Inscription : février 2005 Messages : 1 731 ![]() |
OK. Avec Access 2000/Jet4.0/DAO 3.6, la taille de la BD augmente très fort, même en prédimensionnant.
Voci une dernière proposition que je viens de tester, avec succés: - les tables sont stockées dans une BD dorsale au format Jet 3.x. - l'application reste dans une BD frontale au format Access 2000 (Jet 4.0) et les tables de la dorsale sont liées. J'ai effectué un test d'écriture en boucle avec le principe du prédimensionnement (4 boucle, de 10000 écritures avec open/close sur le recordset à chaque écriture). Dans ces conditions, la taille de la table est constante. C'est peut être vrai aussi sans prédimensionner le champ bin, mais je te laisse le plaisir de le vérifier. _ |
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 11 ![]() |
Help !
|
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 11 ![]() |
Si la base est au format acces97 ca marche aussi Mal
le probleme vient du moteur JET 4.0 (DAO 3.6) Help ! |
|
|
00
|
|
|
#12 | ||
|
En attente de confirmation mail
Inscription : février 2005 Messages : 1 731 ![]() |
Bonjour,
Si la base est au format Access 97, la modification d'enregistrements existants dont le champ "bin" est prédimensionné (c-à-d les conditions de mes tests) ne fait pas grossir la base. Dans mon cas, la BD contient seulement une table T_BIN, avec un seul champ nommé "bin". La table comprend 2 enregistrements. Voici mon code: Code :
|
||
|
|
00
|
|
|
#13 | ||
|
En attente de confirmation mail
Inscription : février 2005 Messages : 1 731 ![]() |
Pour compléter mon précédent message, je constate comme toi que la BD grossit si toutes les 1000 écritures sont réalisées dans le même recordset.
Cf. le code ci-dessous: Code :
Qu'en penses-tu ? _ |
||
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 11 ![]() |
si la base reste ouverte ,la taille monte a l'infini .
(il suffit d'une instance database sur la base) je ne peut pas fermer ma base. (sinon je pourrais la compacter dans le code!!) Help ! |
|
|
00
|
|
|
#15 | |
|
En attente de confirmation mail
Inscription : février 2005 Messages : 1 731 ![]() |
Citation:
Je ne vois pas le rapport avec la base ouverte... ![]() Merci de m'éclairer. _ |
|
|
|
00
|
|
|
#16 | ||
|
Invité de passage
![]() Inscription : février 2008 Messages : 11 ![]() |
le probleme persiste:
meme si on ferme la recordset meme si on ferme la base de donnée par contre , si il n'y a plus aucune instance de la base, la taille se stabilise dans mon exemple il suffit de mettre en commentaire le code de Form_Load Help ! ##################################### Code :
|
||
|
|
00
|
|
|
#17 | ||
|
En attente de confirmation mail
Inscription : février 2005 Messages : 1 731 ![]() |
Effectivement, tu as raison...
On ne peut rien faire car c'est un problème inhérent à Jet depuis la version 3.x... Explication: Des pages particulières de la BD stockent les valeurs des champs qui contiennent de gros objets (Memo, BLOB, etc.). Quand un de ces champs est "vidé" (mis à Null) ou modifié (avec une nouvelle valeur), la page concernée est invalidée pour être ensuite recyclée. Le problème c'est que ce recyclage n'est pas réalisé si la BD est ouverte par 2 utilisateurs ou plus: donc ta base grossit, surtout si tu écris des BLOB "en veux-tu en voilà" ! Alors le recyclage ne se fera qu'au compactage de la BD. ![]() Il y a un paramétrage du moteur Jet pour autoriser ou non le recyclage de ces pages, (cf. dbRecycleLVs) mais de toute façon, le recyclage n'est pas effectif en cas d'ouverture de la BD par plus d'un utilisateur. Code :
Ma BD de test ne dépasse jamais 256 Ko, et pas de compactage ! (j'ai utilisé le principe du prédimensionnement). Tu peux placer tes données dans une BD au format Jet 2.0 et là pas de souci, le recyclage fonctionne toujours bien. Donc une BD dorsale au format 2.0 avec tes données, et une BD applicative au format que tu voudras (ex celui utilisé par Access 2000) qui accède à la BD dorsale au moyen de tables attachées (liées). _ |
||
|
|
00
|
|
|
#18 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 11 ![]() |
je vais tester ta solution.
ayant un abonnement MSDN , j'ai essayé de leur communiquer mon probleme. ils ont oser me dire qu'ils ne supportait plus les bases access 2000,VB6. !! ils vont peut etre m'aider ?? MERCI |
|
|
00
|
|
|
#19 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 11 ![]() |
la ligne
DBEngine.SetOption dbRecycleLVs, 1 semble resoudre le probleme ma base est effectivement ouverte par un poste distant, mais la liason n'est pas permanente . MERCI JBO pour ta patience stouri |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com