Quale linguaggio di programmazione scegliere per questo compito di elaborazione dati e XML? [chiuso]

5

Attualmente codice in PHP. Recentemente ho lavorato su un progetto usando PHP e Symfony che:

  1. legge file XML di grandi dimensioni (un sacco di analisi / lettura DOM),
  2. converte file XML di grandi dimensioni in array di grandi dimensioni,
  3. unisce 2 array di grandi dimensioni (un sacco di ordinamenti di array),
  4. prende i 2 grandi array e li trasforma in un file CSV di grandi dimensioni.

L'ho terminato in PHP, ma ora richiede una certa quantità di memoria e richiede circa 8-15 secondi per essere eseguito. Così ora ho le seguenti opzioni e ho bisogno di aiuto per sceglierne una:

  1. Prova a riscriverlo / refactoring usando metodi migliori in PHP
  2. Scegli un linguaggio di programmazione diverso (ho voluto impararne uno, forse un altro linguaggio elabora queste cose molto più velocemente?)
  3. Fai 1 o 2 e inoltre imposta qualcosa per leggere costantemente i file xml e scriverli su documenti MongoDB per servire i client dal database invece di rottamare i dati.

Sono propenso a fare 2 o 3 (usando una lingua diversa), poiché sono sicuro che c'è un altro linguaggio che gestisce questo tipo di attività molto più velocemente (ad esempio Python, C ecc.). È solo che non sono sicuro di quale.

    
posta NoviceCoding 15.01.2012 - 16:09
fonte

5 risposte

17

Prima di scegliere una lingua diversa, prima assicurati che la lingua sia il collo di bottiglia . Quindi hai effettivamente misurato il tempo per i 4 passaggi? Sapete che, ad esempio, la maggior parte del tempo di attesa per il passaggio 1 viene speso nell'interprete di lingua (e non causato dall'IO del disco)? Se quest'ultimo è il caso, quindi scegliere una lingua come C ++ (o anche assemblatore) potrebbe non portare alcun aumento di velocità rilevante.

L'elaborazione XML dipende spesso dalla velocità del parser XML, quindi potrebbe essere la prossima cosa da guardare, qualcosa che dipende solo parzialmente dalla lingua. libxml è molto veloce, è una libreria C, ma è anche disponibile come estensione PHP. Costruire grandi matrici può essere velocizzato da un cambio di lingua, l'ordinamento, tuttavia, probabilmente non (o non molto), se si utilizza la funzione di ordinamento incorporato di PHP (che è una funzione di libreria codificata molto probabilmente in C o C ++ stesso). E la scrittura di dati in un file è in gran parte dominata dall'I / O del disco - di nuovo qualcosa in cui un'altra lingua non è di aiuto.

Quindi prima assicurati di dove si trova il vero problema, altrimenti rimarrai stupito di quanto si possa essere sbagliato quando si effettuano ipotesi di ottimizzazione senza misurare.

    
risposta data 15.01.2012 - 18:32
fonte
5

La lingua che consiglierei per lavorare con XML è XSLT progettata per questo scopo. È ideale per unire file XML e produrre un file CSV come output.

XSLT è l'acronimo di XSL Transformations ed è un W3C (World Wide Web Consortium Recommendation dal 1999). XML è anche uno standard W3C, quindi sia XML che XSLT sono standard correlati, infatti XSLT è in effetti XML, quindi se conosci l'XML, che presumibilmente lo fai se lavori con documenti XML, quindi capisci già la struttura di un programma XSLT.

Firefox, IE e Google Chrome implementano tutti i processori XSLT. Inoltre Microsoft, Apple ha implementato processori XSLT e apre processori sorgente come toolkit di Gnome .

Dal momento che ci sono state così tante implementazioni dei processori XSLT, le offerte dei principali fornitori sono altamente ottimizzate e un IMHO è improbabile che trovi un'implementazione alternativa per lavorare con file XML che superino la velocità.

Secondo Wikipedia:

Increasingly, however, XSLT processors use optimization techniques found in functional programming languages and database query languages, such as static rewriting of an expression tree (e.g., to move calculations out of loops), and lazy pipelined evaluation to reduce the memory footprint of intermediate results (and allow "early exit" when the processor can evaluate an expression such as following-sibling::*1 without a complete evaluation of all subexpressions). Many processors also use tree representations that are significantly more efficient (in both space and time) than general-purpose DOM implementations.

Potresti vedere anche queste altre domande: link & link

    
risposta data 15.01.2012 - 17:36
fonte
4

Sorpreso che nessuno lo abbia menzionato, ma invece di leggere / analizzare i dati XML in un DOMDocument, puoi usare l'elaborazione SAX. Ciò significa che mentre i dati XML vengono letti e analizzati, esistono funzioni aggiunte che verranno eseguite. Ad esempio, quando il tag iniziale di un elemento chiamato "root" si verifica, eseguirà una funzione chiamata "root_start" o qualsiasi altra cosa desideri.

È possibile utilizzare il metodo di elaborazione SAX utilizzando la libreria XML Parser . Includono un pochi examples .

È quindi possibile saltare la memorizzazione dei dati XML come un DOMDocument e memorizzare i dati come quei grandi array che si menzionano. Quindi continua a unire / ordinare come hai fatto prima. Ciò dovrebbe ridurre sia il consumo di memoria sia il tempo impiegato per l'attività.

Assicurati di utilizzare anche un buon algoritmo di ordinamento / fusione. Potresti voler eseguire un ordinamento o un merging mentre stai elaborando il documento XML ...

    
risposta data 16.01.2012 - 03:58
fonte
-4

Se puoi imparare e utilizzare uno strumento diverso da PHP, MS LinQtoXML è una buona opzione, funziona perfettamente per caricare XML da file, serializzare, interrogare XML come SQL, aggiungere, rimuovere, impostare valori e unire le raccolte.

Controlla questo per ulteriori dettagli da Microsoft Panoramica da LINQ a XML

e questo LINQ a XML rispetto ad altre tecnologie XML

Ecco un semplice esempio per generare file CSV da XML      msdn.microsoft.com/en-us/library/bb387094.aspx

puoi trovare .Net Mono framework ed editor di codice per giocare con questo da qui www.mono-project.com e editor monodevelop da qui monodevelop.com/ se non stai usando la piattaforma Windows.

Spero che questo ti aiuti.

    
risposta data 15.01.2012 - 20:18
fonte
-5

Se miri a migliorare il tempo di esecuzione del tuo programma, penso che un linguaggio compilato (c, c ++ ..) funzionerebbe meglio di uno interpretato (PHP, python) per eseguire attività ridondanti. Su googlando per un parser XML in C ho trovato link . Spero che questo ti aiuti.

    
risposta data 15.01.2012 - 17:55
fonte

Leggi altre domande sui tag