2011-08-19 6 views
7

Tengo un programa de Java que usa ProcessBuilder para llamar al comando de ordenamiento de Unix. Cuando ejecuto este código dentro de mi IDE (intelliJ) solo toma alrededor de un segundo ordenar 500,000 líneas. Cuando lo empaqueto en un contenedor ejecutable, y lo ejecuto desde el terminal, demora unos 10 segundos. Cuando ejecuto el comando de clasificación desde la terminal, ¡tardan 20 segundos!El comando de ordenamiento de Unix toma mucho más tiempo dependiendo de dónde se ejecuta ?! (más rápido desde ProcessBuilder en el programa ejecutado desde IDE, más lento desde la terminal)

¿Por qué la gran diferencia en el rendimiento y en qué forma puedo lograr que el contenedor se ejecute con el mismo rendimiento? El entorno es OSX 10.6.8 y java 1.6.0_26. La parte inferior de la página del manual de tipo dice "una especie 5,93 de noviembre de 2004"

El comando que se está ejecutando es:

sort -t' ' -k5,5f -k4,4f -k1,1n /path/to/imput/file -o /path/to/output/file 

Tenga en cuenta que cuando corro tipo de la terminal necesito escapar manualmente la pestaña delimitador y utilice el argumento -t$'\t' en lugar de la pestaña real (que puedo pasar a ProcessBuilder).

Buscando como ps todo parece igual, excepto cuando se ejecuta desde IDE el comando ordenar tiene un TTY de ?? en lugar de ttys000, pero desde this question no creo que deba hacer la diferencia. ¿Quizás BASH me está frenando? ¡Me estoy quedando sin ideas y quiero cerrar esta brecha de rendimiento de 20 veces!

+0

wow .. Creo que vi a otra persona pide la misma pregunta ayer. http://stackoverflow.com/questions/7111127/why-is-my-application-running-faster-in-intellij-compared-to-command-line – Kal

+1

¿Sabes que estás ejecutando el mismo tipo? Pruebe una ruta absoluta al ejecutable para estar seguro. Si tiene brew/macports/fink instalado, es posible que el ordenamiento de esos paquetes se ejecute cuando es más lento. – ergosys

+0

@Zugwalt: qué tan "ancho" es cada registro, o dicho de otra forma, qué tan grande es el archivo general que está ordenando. 500,000 de un registro normal en 1 segundo suena bien para los sistemas Unix en los que estoy acostumbrado a trabajar. 20 segundos parece una locura. El género construirá sus archivos temporales en/tmp o/var/tmp dir (a menos que lo sobrescriba con '-D'). Tal vez puedas encontrar una pista allí mirando el procesamiento. De lo contrario, estoy pensando en problemas con los discos, ¿su IDE está escribiendo archivos tmp en un lugar diferente al estándar/tmp/o/var/tmp? Buena suerte. – shellter

Respuesta

12

voy a aventurar dos conjeturas:

  • quizás desea invocar diferentes versiones de una especie (efectúe una which sort y utilizar la ruta absoluta completa a recompare?)

  • quizás usted es usando configuraciones locas más complicadas (lo que lleva a un manejo de conjuntos de caracteres más complicado, etc.)? Trate

    export LANG=C 
    sort -t' ' -k5,5f -k4,4f -k1,1n /input/file -o /output/file 
    

a comparar

+2

Su segunda conjetura fue eso. Llamando a processBuilder.environment(). Put ("LANG", "C") antes de processBuilder.start() vimos la misma ejecución de ejecución desde el shell (que estaba por defecto en_US: UTF-8) como el IDE. Esta lectura también da algunos números que revelan en_US: UTF-8 es casi 10 veces más lento que C y 5 veces más lento que en_US http://computing.fnal.gov/unix-users/tips/Lang_Tips.html – Zugwalt

+1

Bravo @sehe! Aprendí algo valioso aquí. También un voto a favor de @Zugwalt por incluir el enlace a Lang_Tips.html. ¡Excelente! – shellter

+0

¡Gracias a todos por su apoyo! Es bueno tener tanta suerte en adivinar la causa a veces :) – sehe

0

Tenga una mirada en este proyecto: http://code.google.com/p/externalsortinginjava/

evitar la necesidad de llamar a una especie externa del todo.

+2

Probé esto, pero fue mucho más lento que el tipo de Unix, incluso cuando se llama desde la consola (1 minuto 30 segundos) – Zugwalt

Cuestiones relacionadas