XSLTProcessor xmlSAX2 Caratteri: memory insufficiente

Ho una pagina che carica un file xml da 500 mb e analizza il file usando un model xsl. Il parser funziona perfettamente nel mio ambiente locale. Sto usando WAMP.

Sul server web.

Attenzione: DOMDocument :: load () [domdocument.load]: (null) xmlSAX2Caratteri: memory esaurita in /home/mydomain/public_html/xslt/largeFile.xml, row: 2031052 in / home / miodominio / public_html / xslt / parser_large .php on line 6

Il mio codice è il seguente, la row 6 carica il file xml

<?php
$xslDoc = new DOMDocument();
$xslDoc->load("template.xslt");

$xmlDoc = new DOMDocument();
$xmlDoc->load("largeFile.xml");

$proc = new XSLTProcessor();
$proc->importStylesheet($xslDoc);
echo $proc->transformToXML($xmlDoc);
?>

Ho provato a copiare il file php.ini dall'installazione di Wamp nella cartella in cui si trova il codice precedente. Ma questo non ha aiutato. Il limite di memory in questo file php.ini è memory_limit = 1000M

Qualsiasi consiglio / esperienza su questo sarebbe molto apprezzato

Ecco la triste verità. Esistono due methods di base per lavorare con XML, basato su DOM, in cui l'integer file XML è presente contemporaneamente nella memory (con un sovraccarico considerevole per renderlo veloce da attraversare) e SAX in cui il file passa attraverso la memory, ma solo un una piccola porzione di esso è presente in qualsiasi momento.

Tuttavia, con DOM, l'elevato consumo di memory è abbastanza normale.

Ora il linguaggio XSLT in generale consente costruzioni che accedono a qualsiasi parte dell'integer file in qualsiasi momento e quindi richiede lo stile DOM. Alcuni linguaggi di programmazione dispongono di librerie che consentono di alimentare l'input SAX in un processre XSLT, ma ciò implica necessariamente restrizioni sul linguaggio XSLT o il consumo di memory non molto meglio di quello del DOM. PHP non ha un modo per rendere XSLT in grado di leggere input SAX, però.

Questo ci lascia alternative al DOM; ce n'è uno e si chiama SimpleXML. SimpleXML è un po ' complicato da usare se il tuo documento ha namespace. Un benchmark antico sembra indicare che è un po 'più veloce, e probabilmente anche less dispendioso con il consumo di memory, rispetto al DOM su file di grandi size.

E infine, ero nei tuoi panni una volta in un altro linguaggio di programmazione. La soluzione era dividere il documento in piccoli basati su regole semplici. Ogni piccolo documento conteneva un'intestazione copiata dall'integer documento, un elemento "dettaglio" e un piè di pagina, rendendo il suo formato valido rispetto allo schema del grande file XML. È stato elaborato utilizzando XSLT (supponendo che l'elaborazione di un elemento di dettaglio non guardi in nessun altro elemento di dettaglio) e le uscite combinate. Funziona come un fascino ma non è implementato in pochi secondi.

Quindi, ecco le tue opzioni. Scegline uno.

  • Analizza e processa XML usando SAX .
  • Usa SimpleXML e spera che consenta file leggermente più grandi nella stessa memory.
  • Esegui un processre XSLT esterno e sperare che consenta file leggermente più grandi nella stessa memory.
  • Dividere e unire XML usando questo metodo e applicare XSLT solo su piccoli pezzi. Questo metodo è pratico solo con alcuni schemi.