2010-10-29 15 views
10

Si dice che Java sia 10 volte più veloce di Python in termini di prestazioni. Questo è quello che vedo anche dai benchmark. Ma ciò che realmente blocca Java è il tempo di avvio della JVM.Un modo per aumentare la velocità di avvio JVM?

Questo è un test che ho fatto:

$time xlsx2csv.py Types\ of\ ESI\ v2.doc-emb-Package-9 
... 
<output skipped> 
real 0m0.085s 
user 0m0.072s 
sys  0m0.013s 


$time java -jar -client /usr/local/bin/tika-app-0.7.jar -m Types\ of\ ESI\ v2.doc-emb-Package-9 

real 0m2.055s 
user 0m2.433s 
sys  0m0.078s 

stesso file, un file incorporato 12 KB ms XLSX all'interno Docx e Python è 25x più veloce !! WTH !!

Ci vuole 2.055 sec per Java.

So che è tutto dovuto al tempo di avvio, ma quello che mi serve è che ho bisogno di chiamarlo tramite uno script per analizzare alcuni documenti che non voglio re-inventare la ruota in python.

Ma, come per analizzare 10k + file, è solo che non pratico ..

Comunque per accelerarlo (ho già provato l'opzione -client e che accelerare da così poco (20%)).

mio un'altra idea? Eseguirlo come demone a esecuzione prolungata, comunicare utilizzando socket UDP o Linux-ICP localmente?

+1

Non riesco a credere che nessuno abbia menzionato ** utilizzare l'ultima versione di Java ** – artbristol

+0

possibile duplicato di [Come velocizzare l'avvio di Java VM (JVM)?] (Http://stackoverflow.com/questions/1491325/how-to-speed-up-java-vm-jvm-startup-time) –

risposta

9

Prova Nailgun.

Nota: Non faccio uso personalmente.

+0

Suoni perfetti !! quello è ciò di cui ho bisogno!! Fammi provare e ti farò sapere. –

+4

soluzione PERFETTA per me.Avevo provato e stupito di quanto sia semplice, senza mai dover scrivere una sola riga di codice in java, che dia direttamente un processo a lungo termine al server client! rocce di nailgun! –

+0

http://stackoverflow.com/questions/1491325/how-to-speed-up-java-vm-jvm-startup-time parla anche di flebo ecc ... – rogerdpack

2

Um ... scrivere i documenti in una directory (se non sono già) e hanno il processo di programma Java tutti in una volta sola?

+0

Il problema è che ogni volta che Parsed deve comunicare di nuovo (per elaborazione, mettere dentro DB), quindi non è un punto, grazie, già considero questa opzione. –

0

Ci sono molti modi per fare questo - in fondo tutto ciò funzionerà fornendo mantiene la JVM in vita per tutta la durata di tutti i tuoi elaborazione in batch.

ad es., Perché non modificare semplicemente il programma Java per scorrere tutti i file e elaborarli tutti in un'unica chiamata di JVM?

Oppure è possibile creare una semplice applicazione GUI in Swing e disporre di un modo visivo per eseguire il batch (ad esempio, selezionare le directory di destinazione, quindi premere il pulsante "Elabora tutto ...").

Oppure si potrebbe usare un Clojure REPL come un modo per scritto l'esecuzione del lavoro Java appropriata ....

Oppure si potrebbe creare un processo server con qualcosa come Netty e inviare tutti i file attraverso questo .. ..

+0

Grazie, ma, quello che sto facendo è lato server, web-app, ajaxed. Sì, ho già elaborato tutto il pulsante, il browser di directory, il motore di ricerca tutto già scritto, in Python (il motore di ricerca è Sphinx in C). –

5

appena imparato sulla flebo di oggi, come la sostituzione alternativa al nailgun: https://github.com/flatland/drip vedere anche questa pagina per alcuni suggerimenti generali: vedi anche https://github.com/jruby/jruby/wiki/Improving-startup-time

+0

Il gocciolamento funziona con JRuby> = 1.7.2? I miei tentativi di misurare qualsiasi significativo aumento di velocità non hanno avuto esito positivo (anche l'ambiente di rastrello eseguito su un progetto banale generato tramite i binari nuovi non ne beneficia). –

+0

[Non l'ho mai provato.] Quale sistema operativo? funziona nailgun/aiuto? (forse chiedi al gocciolamento?) – rogerdpack

+0

Apparentemente "può" funzionare con jruby, e dovrebbe avere un metodo dripMain dal 1.7.1 Credo che http://crashruby.com/2013/01/21/drip-with-jruby – rogerdpack

1

modificare il programma a un modello client/server, dove il Java parte è a server persistente che viene avviato solo una volta, alimentato da un client che gli dice cosa fare. Il client potrebbe essere un piccolo script Python che dice al server di elaborare quali file consumare. Magari inviare comandi tramite una presa, o segnali, a te.

Problemi correlati