Come leggere file XML di grandi dimensioni in modo efficiente

4

Ho un grande file XML (circa 75.000 linee) da cui devo costruire un catalogo (case). Costruire le liste funziona bene, ma ora ho un problema.

Il catalogo dovrebbe avere una pagina di presentazione dettagliata di una casa. Una casa ( <item id="123"> ) ha circa 800-1200 righe di dati, in base al tipo di casa.

Qual è il modo migliore, come riferirsi a rendere lo script più veloce e salvare linee di codice, leggere questi dati e presentarli?

Alcune case, per esempio, hanno una sauna, e quando questi dati sono nel file XML, la pagina di presentazione dovrebbe contenere una sezione sauna.

Ho provato prima a leggere l'intero contenuto XML con una funzione ricorsiva negli array e con un sacco di foreache s (la profondità massima dei bambini è tre) con SimpleXML , ma era davvero brutto lento e la ricorsione non funzionava affatto, perché il mio computer non poteva gestire così tanto input.

Esiste un altro modo per creare questi dati eccetto interrogare ogni variabile con if ?

    
posta Owl 17.04.2013 - 14:02
fonte

4 risposte

9

XML è un metodo inefficiente di memorizzazione di grandi quantità di dati. Utilizza molto spazio su disco (guarda un file XML e nota che gran parte di esso è occupato dalla sintassi e dalla definizione della struttura) ed è lento e richiede un uso intensivo della memoria. L'intero albero (o almeno una grande porzione di esso) deve essere analizzato solo per ottenere un singolo elemento, e i parser XML spesso usano più volte la dimensione del file nello spazio di memoria per farlo.

Se devi fare qualcosa di sensibile alle prestazioni (come caricare informazioni su una pagina web), 75.000 righe di XML non saranno veloci.

Se le prestazioni sono importanti, è necessario spostare le informazioni in un database relazionale, come suggerito da thorsten Müller. Allora il tuo compito diventerà banale. Anche se non si ha altra scelta che ricevere i dati in XML, fare in modo che il programma esegua un caricamento una tantum di quel file XML nel database ogni volta che viene aggiornato, quindi utilizzare il database per il resto del percorso. Oltre ad essere più veloce, il database sarà anche molto più facile da usare.

Se scegli di rimanere con XML, puoi ottenere aiuto con il tuo algoritmo, ma sono necessarie ulteriori informazioni. Suggerisco di pubblicare la parte del codice che descrivi su Revisione codice .

    
risposta data 17.04.2013 - 16:17
fonte
7

Forse si sta verificando la limitazione che SimpleXML tenta di leggere l'intero documento in un unico passaggio e il tuo documento è grande o complesso. Un'alternativa è usare un parser stream o event-based che legge bit alla volta, imposta lo stato del parser in base a ciò che è stato letto e ti consente di registrare gestori che reagiranno a eventi specifici. Ecco una spiegazione dell'idea con un semplice esempio: link

Non ho molta familiarità con PHP, ma sembra che ci sia qualcosa come SAX da provare: link . Dall'introduzione:

This extension lets you create XML parsers and then define handlers for different XML events.

La ricerca di sax in php su Google mostra anche alcuni indizi promettenti.

    
risposta data 18.04.2013 - 04:52
fonte
1

Recentemente ho postato su come raggiungerlo, qui una panoramica del post:

Negli ultimi 4 anni ho lavorato con molti fornitori di XML (interconnessioni di applicazioni B2B) e alcuni di questi provider distribuiscono file XML di grandi dimensioni, alcuni di loro hanno più di 2 GB, come potresti già sospettare non dovremmo scaricare 2 GB di informazioni in memoria perché PHP genererà un errore fatale di overflow di memoria e la tua applicazione non sarà in grado di recuperare da sola, quindi in questo post spiegherò come risolvere questo problema, utilizzando:

  • Generatori: i generatori forniscono un modo semplice per costruire semplici iteratori senza implementare l'interfaccia Iterator per ulteriori informazioni leggere: Nuove funzionalità di PHP 5.5

  • XMLReader: è un'implementazione PHP sulla spalla di libxml che consente di leggere i file XML in modo efficiente poiché agisce come un cursore di avanzamento.

  • SimpleXMLElement: crea un oggetto XML da una stringa XML.

Leggi i file XML in modo efficiente in PHP

    
risposta data 11.11.2016 - 23:47
fonte
1

Se si presentano le informazioni tramite pagine Web, è possibile suddividere i dati XML in modo che:

a. Il file principale contiene solo i dati introduttivi e meta per TUTTE le case / prodotti / servizi.

b. I dettagli di ogni casa / prodotto / servizio sono in file separati per ciascuno.

L'idea è questa:

a. La tua pagina di elenco utilizzerà solo il file principale.

b. La tua pagina di dettaglio per una casa / prodotto / servizio sarà:

_ 1. Carica l'XML principale.

_ 2. Caricare e aggiungere l'XML casa / prodotto / servizio specifico al nodo richiesto nell'XML principale. (Anche se è l'unico, è possibile aggiungerlo al nodo radice.)

    
risposta data 27.12.2018 - 02:47
fonte

Leggi altre domande sui tag