Domanda

Ho bisogno di consigli su cosa usare in Delphi (uso Delphi 2009) per gestire file XML di grandi dimensioni (ad es. 100 MB) il più velocemente possibile.

Devo inserire l'XML, accedere e aggiornare i dati in esso contenuti dal mio programma, quindi esportare nuovamente l'XML modificato.

Speriamo che l'input e l'output possano essere eseguiti in pochi secondi su una macchina Windows veloce.


Chiarimento. Mi aspetto che dovrò usare DOM, perché l'accesso alla struttura dei dati per lo sviluppo di report e l'aggiornamento dei dati è importante e ho bisogno che questa funzionalità sia molto veloce.

L'input viene eseguito una sola volta per il caricamento dei file e l'output solo per il salvataggio dei file, in genere solo una volta all'uscita. Anche questi dovrebbero essere rapidi, ma non sono importanti quanto l'accesso e l'aggiornamento dei dati in memoria.

La mia comprensione è che i parser di terze parti aiutano solo con input e output, ma non sull'uso e sulla modifica dei dati una volta caricati in memoria. O mi sbaglio su questo?

È stato utile?

Soluzione

Se ho compreso correttamente la tua domanda, hai una struttura di dati nota e stai modificando i dati, non la struttura XML del file.

In queste condizioni e se le prestazioni sono cruciali , puoi provare a manipolare direttamente il testo: salta l'analisi XML.

Leggi dallo stream, usa un algoritmo di ricerca veloce del testo, ad es. Boyer-Moore , per trovare i luoghi in cui è necessario modificare i dati, apportare le modifiche e l'output dati in un altro flusso.

Si tratterebbe di un passaggio, nessuna analisi XML, nessuna costruzione di alberi XML in memoria.

Altri suggerimenti

Vale la pena considerare SAX invece di un parser DOM.

Con DOM si paga l'overhead del caricamento del documento, ma una volta caricati è possibile accedere e aggiornare rapidamente i dati caricati.

Con SAX devi scrivere gestori per begin-element, end-element, ecc., ma hai molta più flessibilità in ciò che fai mentre procedi.

Anche se probabilmente non aiuta la tua situazione, SAX è molto utile dove stai cercando perché puoi interrompere l'analisi in qualsiasi momento, quindi una volta trovato quello che volevi puoi fermarti.

Se il tuo programma non ha bisogno di aver analizzato tutti i dati prima di sapere quali modifiche apportare, potresti scrivere gestori SAX che hanno appena aggiornato i dati quando sono stati letti e altrimenti li hanno passati, quindi li streaming piuttosto che dover caricare tutto in qualsiasi tipo di struttura di memoria. Ciò renderebbe la soluzione molto scalabile poiché non colpirai i vincoli di memoria con file molto grandi.

Per quello che vale, tendo a usare i parser MSXML DOM e SAX. Si può sostenere che non sono le migliori, io sostengo che probabilmente ci sono più persone che lavorano per migliorarle, quindi miglioreranno sempre di più.

Sono molto soddisfatto di NativeXML di SimDesign. Include anche una versione speciale chiamata FastXML, che non ho ancora testato, ma mi viene detto di essere, beh, veloce.

Potresti dare un'occhiata al DIHtmlParser componente da The Delphi Inspiration . Dovrebbe essere "estremamente veloce, specialmente quando si analizzano file di grandi dimensioni" e "su macchine moderne il punteggio sale a più di 15 MB di dati HTML al secondo". Ho avuto delle esperienze piuttosto positive, anche se non l'ho mai provato con file di grandi dimensioni.

Non sono uno specialista, ma credo che il consenso sia che un parser SAX sarà molto più efficiente di DOM ...

Se prendi in considerazione la modalità SAX basata sugli eventi, libreria XML Parser potrebbe essere molto utile.

Un'altra possibilità che ho appena scoperto è con il pacchetto LMD ElPack che ho acquistato, includono una libreria di supporto XML che dicono "è estremamente veloce, completamente abilitata per Unicode e aggiunge solo una piccola impronta ai tuoi file Exe".

Osservando l'origine della loro unità LMDXML.pas inclusa nel pacchetto LMD 7 (per Delphi 2009), si dice che il codice si basa sul codice SimpleXML Release 8.0 (luglio 2006) di Michail Vlasov.

Se hai bisogno solo di una manipolazione diretta, sarei d'accordo con la risposta di zendar.

Per quanto riguarda l'implementazione DOM o SAX, consiglierei DIXml .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top