L’ottimizzazione di documenti XML in Java

2 dicembre 2013

L’XML (eXtensible Markup Language) permette di definire una grammatica per descrivere e formattare i documenti strutturati, consentendo il trasferimento dei dati e delle informazioni utili per elaborarli. Tra i vantaggi derivanti dall’XML vi è la possibilità di trasferire dati che siano comprensibili sia per un osservatore umano che per un elaboratore.

C’è però il rovescio della medaglia. L’utilizzo dei metadati comporta un incremento di dati da trasmettere. Al contempo, al crescere delle dimensioni dei documenti da trasmettere, l’XML comincia a diventare arduo da interpretare per occhi umani. Inoltre, spesso non vi è la necessità di mantenere il documento in forma comprensibile tra una elaborazione e l’altra.

Con il tempo si è conseguentemente diffusa la richiesta di strumenti utili a ottimizzare i documenti XML. In questo articolo si presenterà il problema, diversi approcci utili a risolverlo, e la soluzione offerta dal W3C (World Wide Web Consortium). Si introdurranno infine alcuni strumenti per l’ottimizzazione in Java.

L’articolo è costituito dalle seguenti sezioni:

  • Introduzione al problema e tecniche di risoluzione
  • L’approccio del W3C: EXI (Efficient XML Interchange)
  • Altre soluzioni per l’ottimizzazione dell’XML in Java

Introduzione al problema e tecniche di risoluzione

Come si è già accennato, sono diversi i motivi che hanno portato alla richiesta dell’ottimizzazione di documenti XML. Un problema parallelo è quello dell’ottimizzazione delle query XML, ma esso è fuori dalla portata dell’articolo.

In questa sezione si presenteranno le principali complicazioni che hanno portato alla richiesta di ottimizzazione, anche se si sottolinea che le cause spesso si sovrappongono e non si escludono. A seguire, le principali soluzioni con il relativo trade-off.

I problemi…

  1. Vincoli di memoria e banda. Memorizzare e trasportare i markup è dispendioso, pertanto applicazioni soggette a banda limitata o stringenti vincoli di memoria potrebbero non trovare praticabile l’adozione dell’XML per via della sua verbosità. Stesso problema per applicazioni che richiedono lo scambio di un volume intensivo di dati.
  2. Vincoli di elaborazione. Generare e analizzare un documento XML richiede molte risorse alla macchina che elabora il documento. L’overhead derivante, soprattutto al crescere della complessità della formattazione, tende a crescere in maniera non tollerabile da sistemi con limitate capacità di elaborazione. Impatto secondario, i tempi di elaborazione limitano il volume di documenti processabili, per cui le applicazioni potrebbero non scalare come desiderato, o si potrebbe essere costretti ad optare verso soluzioni con complessità della formattazione minore.
  3. Dati binari. L’XML è un linguaggio testuale, non agevola altri formati come quelli binari. L’XML permette di codificare contenuti in base 64 ed esadecimale, ma questo a sua volta limita le performance, specie per payloads di grosse dimensioni.
  4. Accesso casuale. L’XML è monolitico, richiede che sia disponibile l’intero documento affinché possa essere elaborato (al contrario di altri formati come jpeg). Come conseguenza, è possibile stabilire se è ben formato o valido solo una volta che sia stato acquisito per intero. In aggiunta, meccanismi come l’XML Namespaces complicano il problema in quanto la valutazione deve essere svolta su contesti allargati.

… e le soluzioni

Fin qui abbiamo introdotto i problemi. Passando alle soluzioni, la prima cosa da dire è che vi è un trade-off dovuto al fatto che ogni soluzione rappresenta un compromesso tra i benefici offerti dall’XML e il desiderio di migliorare le performance. Tra i principali vantaggi, l’XML è auto-esplicativo, facilmente estensibile, leggibile ad occhio umano, concettualmente semplice. Un’eventuale ottimizzazione dovrebbe tener conto di questi aspetti e preservarli. In più dovrebbe essere senza perdita, ossia partendo da un documento ottimizzato si dovrebbe poter ricostruire il documento XML originario.

Sono state offerte diverse soluzioni al problema, tra queste vi sono i metodi di compressione basati su Gzip o codifica ASN.1. Ma sarebbe preferibile utilizzare la formattazione come base per un’ottimizzazione mirata. E’ possibile classificare le soluzioni nel seguente modo:

SoluzioneDescrizione
Compressione testualetecnica tradizionale di compressione per ridurre le dimensioni di un documento. Presenta però gli svantaggi di richiedere tempo e tipicamente di rendere il documento opaco fino alla decompressione.
Codifica sulla lunghezzacodificare la lunghezza di elementi, attributi e altre strutture permette di accedere efficientemente e arbitrariamente a determinate parti del documento perché non occorre analizzare tutti i byte. Il problema è che il documento tende a divenire difficilmente comprensibile ad occhio umano.
Dizionario dei tagrimpiazzare l’XML QNames con identificatori più omogenei e di lunghezza fissa per migliorare efficienza e dimensioni del documento. Ma a scapito della leggibilità.
Riordino selettivola flessibilità nella serializzazione del documento può permettere ad alcune applicazioni di migliorare le prestazioni, specialmente se devono accedere solo a parti del documento analizzato. Ciò può andare a discapito della leggibilità.
Ricodifica selettivaalcuni tipi di dati dell’XML, ad esempio il binario base64, sono particolarmente inefficienti sia per le dimensioni che per i tempi di elaborazione richiesti. E’ possibile modificare la codifica di questi dati, probabilmente perdendo la possibilità di visualizzarli sui classici editor di testo.
Codifica basata sui tipiquando il tipo dell’informazione è noto, può essere utilizzato per ricodificare un documento ponendo i tipi in forma canonica, ad esempio con lunghezza fissa. La forma nativa verrebbe recuperata senza problemi. Ciò comporta un’elaborazione poco dispendiosa, al costo della leggibilità e della modificabilità del documento.
Codifica basata sullo schemabasandosi sulla struttura degli schemi XML associati ai documenti, è possibile generare particolari formati, richiedendo però che gli utilizzatori condividano la stessa versione dello schema per generare e consumare un particolare documento. Questa tecnica permette di abbattere le richieste di elaborazione e lo spazio, ma non è auto descrivente, per cui pone problemi al momento dell’evoluzione del formato e normalmente non risulta particolarmente leggibile.

In generale, è probabile che uno strumento di ottimizzazione combini diverse delle tecniche presentate al fine di aumentarne l’efficacia.

Possiamo dire pertanto che l’ottimizzazione consiste in un insieme di metodi per riformattare un documento XML in modo da minimizzarne l’impatto in termini di risorse utilizzate, siano esse banda, memoria, e così via.

Un esempio

Si presenta un esempio di come potrebbe lavorare l’ottimizzazione. Partiamo da una classica struttura “Persona”:

<Persona>
<Nome>Pippo</Nome>
<Cognome>De Pippis</Cognome>
</Persona>

Una possibile ottimizzazione potrebbe portare l’XML in forma piatta, rimpiazzando il contenuto degli elementi con degli attributi, ad esempio:

<Persona Nome="Pippo" Cognome="De Pippis"/>

Ciò ha portato a una significativa compressione dello spazio occupato (un risparmio di circa un terzo), ma risulta possibile recuperare il documento originario? In un caso così semplice si, ma come faremmo a distinguere gli attributi originari da quelli creati dall’ottimizzazione?

Il problema non è così semplice, vedremo pertanto nel prossimo capitolo una soluzione studiata dal W3C.

Se vuoi aggiornamenti su L'ottimizzazione di documenti XML in Java inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su L'ottimizzazione di documenti XML in Java

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy