2010-10-29 12 views
10

Se dice que Java es 10 veces más rápido que Python en términos de rendimiento. Eso es lo que veo de los puntos de referencia también. Pero lo que realmente reduce Java es el tiempo de inicio de JVM.¿Alguna forma de aumentar la velocidad de inicio de JVM?

Ésta es una prueba que hice:

$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 

mismo archivo, un archivo incrustado 12 KB ms XLSX dentro docx y Python es 25 veces más rápido !! ¡¡¡WTH !!

Tarda 2.055 segundos para Java.

Sé que todo se debe al tiempo de arranque, pero lo que necesito es que debo llamarlo a través de un script para analizar algunos documentos que no quiero volver a inventar la rueda en python.

Pero a medida para analizar 10k + archivos, es simplemente no es práctico ..

De todos modos para acelerarlo (Ya he intentado opción -client y es sólo la velocidad por tan poco (20%)).

Mi otra idea? ¿Lo ejecuta como un daemon de larga ejecución, se comunica usando sockets UDP o Linux-ICP localmente?

+1

No puedo creer que nadie haya mencionado ** utilice la última versión de Java ** – artbristol

+0

posible duplicado de [¿Cómo acelerar el tiempo de inicio de Java VM (JVM)?] (Http://stackoverflow.com/questions/1491325/how-to-speed-up-java-vm-jvm-startup-time) –

Respuesta

9

Probar Nailgun.

Nota: No lo uso personalmente.

+0

¡¡Suena perfecto !! ¡¡eso es lo que necesito!! Déjame probarlo y te lo haré saber. –

+4

solución PERFECTA para mí.Probé y me sorprendió lo simple que es, sin tener que escribir una sola línea de código en java, ¡da directamente el proceso de larga ejecución cliente-servidor! ¡rocas de clavos! –

+0

http://stackoverflow.com/questions/1491325/how-to-speed-up-java-vm-jvm-startup-time también menciona por goteo, etc ... – rogerdpack

2

Um ... ¿escriben los documentos en un directorio (si aún no lo están) y hacen que el programa Java los procese a todos de una vez?

+0

El problema es que cada vez que Parsed necesidad de comunicarse de vuelta (por procesamiento, poner dentro de DB), así que no es un punto, gracias a que, ya considero esta opción. –

0

Hay muchas maneras de hacerlo: básicamente, cualquier cosa funcionará siempre que mantenga la JVM activa mientras dure todo el procesamiento por lotes.

por ejemplo, ¿por qué no modifica el programa Java para recorrer todos los archivos y procesarlos todos en una sola invocación de la JVM?

O podría compilar una aplicación GUI simple en Swing y tener alguna forma visual de ejecutar el lote (por ejemplo, seleccionar directorios de destino, luego presionar el botón "Procesar todo ...").

O usted podría utilizar un Clojure REPL como una forma de escritura de la ejecución del trabajo de Java adecuada ....

O bien, podría crear un proceso de servidor con algo como Netty y enviar todos sus archivos a través de ese .. ..

+0

Gracias pero, lo que estoy haciendo es del lado del servidor, aplicación web, ajaxed. Sí, ya tengo procesado todo el botón, navegador de directorios, motor de búsqueda, todo lo que ya está escrito, en Python (el motor de búsqueda es Sphinx en C). –

5

acaba de aprender acerca de goteo hoy en día, como una alternativa a la sustitución nailgun: https://github.com/flatland/drip véase también esta página para obtener algunos consejos generales: véase también https://github.com/jruby/jruby/wiki/Improving-startup-time

+0

¿El goteo funciona para usted con JRuby> = 1.7.2? Mis intentos de medir cualquier aceleración significativa no han tenido éxito hasta el momento (incluso el entorno de rake ejecutado en un proyecto trivial generado a través de los rieles nuevos no se beneficia). –

+0

[No lo he intentado nunca.] ¿Qué sistema operativo? ¿Funciona el nailgun/ayuda? (Tal vez pedir a la gente goteo?) – rogerdpack

+0

Al parecer, "puede" trabajar con jruby, y debe tener un método dripMain desde 1.7.1 Creo http://crashruby.com/2013/01/21/drip-with-jruby – rogerdpack

1

cambiar el programa a un modelo cliente/servidor, donde el Java parte es una servidor persistente que se inicia solo una vez, alimentado por un cliente que le dice qué hacer. El cliente podría ser una pequeña secuencia de comandos de Python que indique al servidor el proceso de qué archivos consumir. Tal vez envíe comandos a través de un zócalo, o señales, hasta usted.

Cuestiones relacionadas