Come velocizzare l'operazione di analisi XML?

2

Attualmente ho uno script php configurato per fare un po 'di parsing xml. A volte lo script è impostato come una pagina inclusa e altre volte è accessibile tramite una chiamata Ajax. Il problema è che il tempo di caricamento per questa particolare pagina è molto lungo. Ho iniziato a pensare che il php che avevo scritto per trovare quello che mi serviva nell'XML fosse scritto male e il mio script fosse molto ricco di risorse. Dopo molte ricerche e test il problema non è in effetti il mio scripting (beh, forse potresti considerarlo un problema con il mio scripting), ma sembra che impieghi molto tempo per caricare i particolari sorgenti xml.

Il mio codice è come tale:

$source_recent = 'my xml feed'; 
$source_additional = 'the other feed I need'; 

$xmlstr_recent = file_get_contents($source_recent);
$feed_recent = new SimpleXMLElement($xmlstr_recent);

$xmlstr_additional = file_get_contents($source_additional);
$feed_additional = new SimpleXMLElement($xmlstr_additional);

In tutti i miei test, il codice sopra riportato è ciò che richiede tempo, non l'elaborazione aggiuntiva che faccio di seguito.

C'è comunque intorno a questo o sono in balia del tempo di caricamento dell'URL xml?

Un pazzo pensiero che ho dovuto aggirare è di caricare il contenuto XML in un db ogni tanto, quindi basta interrogare il db per ciò di cui ho bisogno.

Pensieri? Idee?

    
posta absentx 01.03.2012 - 23:31
fonte

4 risposte

5

Ti suggerisco di esaminare il caching. È probabile che i feed non cambino molto, e se lo fanno, forse puoi permetterti di apportare le modifiche alla tua applicazione un po 'più tardi.

Il caching di base sarebbe qualcosa di simile a questo:

  • Abbiamo i dati XML nella cache?
  • Se lo facciamo, basta usare i dati nella cache.
  • Se non lo facciamo, carica e analizza il file XML e archivia la struttura DOM risultante nella cache, quindi usa i dati analizzati.

Ciò ridurrebbe almeno il tempo medio di risposta; quando la cache scade, una risposta richiederà più tempo, ma il resto in mezzo salterà completamente il passo di analisi.

Se non si desidera che la risposta richieda più tempo, è necessario eseguire l'analisi in modo asincrono. Tale sistema richiede tre componenti: la tua applicazione web esistente, un demone o un cron job e un qualche tipo di archivio dati condiviso: un file semplice in un formato facile da analizzare, una cache di memoria come memcached o un database. Il processo demone / cron job scarica e analizza i file XML a intervalli regolari (ad esempio, ogni minuto o qualsiasi cosa abbia senso) e aggiorna l'archivio dati condiviso. Se l'aggiornamento dell'archivio dati richiede troppo tempo, prendere in considerazione l'utilizzo di due archivi dati che è possibile scambiare atomicamente (ad esempio utilizzando ridenominazioni di file o modifica di un collegamento simbolico). L'applicazione Web non scarica mai o analizza l'XML stesso, ma semplicemente interroga l'archivio dati condiviso. Poiché i dati sono già stati analizzati, l'overhead è sparito.

    
risposta data 01.03.2012 - 23:45
fonte
1

Sai che cosa impiega più tempo? L'I / O del disco sta leggendo il file, è l'allocazione della memoria, sta creando l'albero DOM? A volte è più veloce eseguire l'analisi del flusso piuttosto che leggere l'intero file in memoria e creare un albero DOM, soprattutto se i dati desiderati sono vicini all'inizio del file.

    
risposta data 02.03.2012 - 23:34
fonte
1

Ho anche avuto problemi con l'analisi di file XML di grandi dimensioni. Ho provato Expresso XML Parser. Può analizzare file fino a 35 GB ed è davvero veloce. È davvero facile da usare. È possibile impostare le regole di analisi su un sito Web e testare il file online e quindi utilizzare il codice client per accedere alle regole di analisi da java o javascript.

Hanno una versione gratuita per sviluppatori su www.sxml.com.au

    
risposta data 22.10.2012 - 17:29
fonte
0

Il problema è che richiede parecchio tempo per analizzare l'XML, oppure il problema è che il codice si trova in attesa di e.g. Richieste HTTP per tornare?

È possibile creare socket non bloccanti in PHP, anche se le cose potrebbero complicarsi un po '.

Se hai installato expat , puoi anche impostare gestori di eventi per reagire agli elementi mentre vengono analizzati, che integra una lettura asincrona molto bene.

Forse è possibile delegare questa attività a un altro processo / servizio sviluppato in un linguaggio che supporta operazioni asincrone. Non garantirà un eccesso di velocità (devi comunque aspettare che entrambe le richieste HTTP vengano restituite), ma almeno puoi iniziare a lavorare sui dati non appena attendi che tu abbia ricevuto tutti i dati prima di iniziare l'elaborazione.

Nota che questo è distinto dalla seconda parte della risposta di tdammers . Questa risposta si concentra sul mantenimento e l'elaborazione dell'XML in "tempo richiesto" (necessario quando i dati nei file XML cambiano frequentemente e / o i dati devono essere "in tempo reale"), mentre la risposta di tdammers si concentra sulla conservazione dei dati in una cache (offre prestazioni molto migliori quando i dati non cambiano spesso e / o se i dati "obsoleti" sono accettabili).

    
risposta data 02.03.2012 - 22:18
fonte

Leggi altre domande sui tag