Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 5 su 5

Importazione file XML con crescita anormale delle dimensioni

  1. #1
    Post
    1,833
    Like Inviati  
    0
    Like Ricevuti  
    6
    ImportaXML_MUI.zip

    Nel file zip sono presenti:
    1) ImportaXML_test.accdb
    2) 6_N000_201612_1.xml
    3) ICI_originale.XSD

    Il file XSD non è indispensabile per il thread però visto che c'è di mezzo un XML ho pensato che potrebbe far comodo averlo senza cercarlo su internet.

    Il file accdb è ridotto all'osso: 1 maschera da cui fare tutto e nella quale è contenuto tutto il codice (ma solo per comodità, avevo anche moduli generali appositi ma il comportamento non cambia). Il programma importa il contenuto del file 6_N000_201612_1.xml mettendo le varie informazioni nelle tabelle giuste. Nella maschera è presente la sezione per l'importazione cumulativa di tutti i file xml che si trovano in una determinata cartella solo perché nell'originale c'è anche questo ma non potendo caricare i file veri perché contengono informazioni personali ho dato la possibilità di decidere quante volte importare il file dimostrativo 6_N000_201612_1.xml. Come spesso accade con i file xml, viene fatto un uso intenso di funzioni ricorsive.
    Potrebbero essere presenti anche funzioni di fatto non utilizzate solo perché, come dicevo, ho condensato nella maschera tutto il contenuto anche dei moduli che sarebbero deputati alla gestione di compiti particolari in cui sono gestite un po' tutte le casistiche. Fa uso di FileDialog ma in latebinding, per la selezione della cartella da cui fare l'importazione massiva, mentre è presente il riferimento alla libreria Microsoft XML, v6.0.
    L'utilizzo è su Windows10 a 64bit con Access a 32bit di Office365 o Access 2016 sembre a 32 bit (in ufficio c'è una cosa, a casa un'altra!). Il comportamento è identico, pur nell'irregolarità con cui si presenta. Il file della libreria Microsoft XML, v6.0 in entrambi i casi è C:\Windows\SysWOW64\msxml6.dll.

    Fin da subito il database mi ha creato questa grana: la crescita a dismisura delle dimensioni del file. Ma non sempre.
    A caricamento singolo è quasi impercettibile, anche se i sospetti iniziano a porsi quando caricando 5 o 6 file si arriva a superare i 10 MB. L'importazione cumulativa di circa 130 file xml di diverso contenuto può portare ad avere un file accdb di più di 300 MB. Con una compattazione e ripristino le dimensioni si riducono a circa 7 MB.
    Dallo stesso db di partenza da cui ho creato questo test, rieseguendo il tutto posso anche avviare più volte il caricamento massivo senza avere l'esplosione delle dimensioni, sia con i file xml veri sia con quello dimostrativo caricato 30, 50, 100 volte. Le dimensioni aumentano "del giusto".
    Inspiegabilmente la stessa cosa appena fatta torna a creare il problema dell'aumento anomalo delle dimensioni con necessità di compattazione e ripristino.
    La procedura prevede solo inserimenti in tabella, nessuna cancellazione. A cosa serve tutto quello spazio che viene usato dal file? Non lo so.
    Non cambia nulla se esporto tutto su un file nuovo, appena creato. Stesso comportamento ad intervalli irregolari.
    La maschera contiene anche un pulsante che svuota tutte le tabelle ad eccezione di [tblGerarchia] e [tblTabelle] che comunque hanno un contenuto che non cambia nel tempo. In un'eventuale esportazione in un nuovo file queste due tabelle devono essere popolate prima di eseguire il primo caricamento.

    Vi chiedo di metterlo sotto sforzo, più e più volte, per vedere se il comportamento irregolare si presenta anche sui vostri computer e se magari dopo alcune esecuzioni tranquille le dimensioni del file iniziano a crescere a dismisura.
    Il file accdb e quello xml devono essere nella stessa cartella, ho semplificato il tutto tenendolo così, senza rendere il codice "elastico".
    E se c'è qualche idea su cause e soluzioni... ben venga l'idea.
    Ultima modifica di Phil_cattivocarattere; 22-01-2021 12:31 

  2. #2
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Post
    16,802
    Like Inviati  
    0
    Like Ricevuti  
    23
    Ho fatto una prova banale e stupida, svuotando un po di tabelle oggetto di scrittura... partro da circa 1,2Kb il file.
    Poi ho caricato 10 volte lo stesso file, cosa già di suo da capire se corretta o meno, ed ho incrementi di circa 4Mb ad ogni caricamento.
    Quindi con 10 caricamenti arrivo a circa 50Mb, ma se compatto scendo a 2,5Mb.

    Questo significa che non p problema di Dati nelle Tabelle, ma di Memoria non liberata correttamente nel codice, mi riferisco in particolare alla funzione ricorsiva dello ScanNode, solo a naso, perchè le Ricorsive sono 9 su 10 motivo di Overflow notoriamente... se poi non sono ben scritte...
    Ora non ho approfondito nello specifico cosa può essere o meno oggetto di Miglioramento.... ma credo dovresti orientarti in quelle zone...!

    Vado poi a braccio in quanto ho notato che:
    continui a scrivere i dati nelle tabelle ad incrmento nonostante siano legati allo stesso Oggetto, e scrivi in molte tabelle... vari dati... in particolare faccio osservazione a:
    [UbicazioneCatasto]
    [ClassamentoF]
    [ClassamentoT]
    ecc...

    In tutte le tabelle riservi per i campi Testo e sono una 50ina sempre 255Chars, la dove basterebbero pochi chars.
    Questo, contrariamente al codice, riserva spazio nel DB inutile...
    ℹ️ Leggi di più su @Alex ...

  3. #3
    Post
    1,833
    Like Inviati  
    0
    Like Ricevuti  
    6
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Ho fatto una prova banale e stupida, svuotando un po di tabelle oggetto di scrittura... partro da circa 1,2Kb il file.
    Ma non erano già vuote tutte ad eccezione delle 2 che devono essere già popolate?
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Poi ho caricato 10 volte lo stesso file, cosa già di suo da capire se corretta o meno
    Nella realtà non caricherò mai 10 volte lo stesso file, nemmeno 2 ma sempre e solo 1, qui l'ho fatto perché non potevo creare 10 o 20 o 30 file dimostrativi diversi, salvo fare modifiche ridicole che allora tanto valeva fare 10 file uguali.
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Memoria non liberata correttamente nel codice, mi riferisco in particolare alla funzione ricorsiva dello ScanNode, solo a naso, perchè le Ricorsive sono 9 su 10 motivo di Overflow notoriamente...
    e pensare che l'ho ripreso in mano dopo anni proprio per fare una modifica che pensavo fosse risolutiva. Invece niente! Poi mi accanisco e diventa un chiodo fisso.
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Vado poi a braccio in quanto ho notato che:
    continui a scrivere
    ...
    Questo, contrariamente al codice, riserva spazio nel DB inutile...
    Spazio che viene liberato con la compattazione?
    Proverò a riflettere sulla funzione ScanNode per vedere se capisco cosa posso migliorare. Magari fra altri 3 o 4 anni l'ho imparato e lo metto in pratica.

  4. #4
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Post
    16,802
    Like Inviati  
    0
    Like Ricevuti  
    23
    Quote Originariamente inviato da Phil_cattivocarattere Visualizza il messaggio
    Ma non erano già vuote tutte ad eccezione delle 2 che devono essere già popolate?
    Beh si... ma io ho premuto 1 volta, poi ho guardato, poi ho premuto la 2à e confrontato, poi la 3 e consolidato...!
    A quel punto ho Vuotato tutto, e premuto 10 volte di fila.
    Quote Originariamente inviato da Phil_cattivocarattere Visualizza il messaggio
    ...
    Spazio che viene liberato con la compattazione?
    Ma non credo... infatti ho detto che non era questo il problema principale, ma serve andare via puliti per fare considerazioni, quindi ho modificato a 50Chars tutti i campi... per vedere e la differenza è irrilevante dal punto di vista della scrittura in tabella.
    Quote Originariamente inviato da Phil_cattivocarattere Visualizza il messaggio
    Proverò a riflettere sulla funzione ScanNode per vedere se capisco cosa posso migliorare. Magari fra altri 3 o 4 anni l'ho imparato e lo metto in pratica.
    Penso sia quì l'inghippo...
    Ultima modifica di @Alex; 22-01-2021 16:10 
    ℹ️ Leggi di più su @Alex ...

  5. #5
    Post
    1,833
    Like Inviati  
    0
    Like Ricevuti  
    6
    Quando si dice "da che pulpito viene la predica": ricerca con google e voilà il primo link proposto
    https://stackoverflow.com/questions/...database-bloat
    Albert D. Kallal che non è proprio l'ultimo arrivato per quanto riguarda Access interviene dicendo
    You also can turn off row locking. I have a process and a file of about 5 Megs in size. When you run a simple update, it bloats to a 125 Megs. If you turn off row locking, then the file does not grow at all with the update. So you want to disable row locking – this will MASSIVE reduce bloating. The option you want to un-check is this one: File->options->client settings, and then uncheck
    [x] Open database by using record-level locking
    Access does not have true row locking, but does have what is called database page locking. So in a roundabout way, if you turn on row locking, then Access just expands all records to the size of one database page – the result is massive bloating. Try disabling the above option. (You have to exit + re-start Access for this setting change to take effect).
    Fatto, funziona. Lo stesso file che un istante prima soffriva di questo comportamento bizzarro, una volta tolta la spunta si comporta come da previsione. Rimessa la spunta, al primo caricamento ripresenta il problema. Direi che la soluzione è proprio lì.
    Ora vediamo anche di capire in generale cosa comporta quella modifica oltre al beneficio delle dimensioni sotto controllo. Vi tengo aggiornati se c'è qualcosa di significativo.

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Cancellazione delle tabelle "Errore importazione"
    Da Massimo_914 nel forum Microsoft Access
    Risposte: 14
    Ultimo Post: 19-12-2020, 10:35
  2. Crescita esponenziale database .mdb
    Da redcell nel forum Microsoft Access
    Risposte: 6
    Ultimo Post: 11-11-2018, 11:27
  3. Crescita database Access
    Da WEM nel forum Visual Basic 6
    Risposte: 8
    Ultimo Post: 05-03-2011, 10:07
  4. Risposte: 1
    Ultimo Post: 28-07-2010, 13:36
  5. verifica dimensioni file
    Da dolcissimo nel forum Visual Basic 6
    Risposte: 32
    Ultimo Post: 26-05-2006, 00:01