2010-12-28 19 views
6

Ho uno script in Python che esegue alcuni calcoli. Quando eseguo questo script in console ci vogliono circa 7 minuti per essere completato, ma quando lo eseguo ho pensato che la shell Java richiedesse tre volte di più. Io uso seguente codice per eseguire lo script in Java:Esecuzione più lunga tramite shell Java rispetto alla console?

this.p = Runtime.getRuntime().exec("script.py --batch", envp); 

this.input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
this.output = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
this.error = new BufferedReader(new InputStreamReader(p.getErrorStream())); 

Avete qualche suggerimento perché lo script Python viene eseguito tre volte più a lungo in Java che in una console?

aggiornamento (29.12.2010)

Il calcolo va come segue:

  1. Java invia i dati al Python.
  2. Python legge i dati.
  3. Python genera un albero decisionale --- questa è un'operazione lunga.
  4. Python invia una conferma che l'albero è pronto.
  5. Java riceve la conferma.

Successivamente c'è una serie di comunicazioni tra Java e Python ma richiede solo diversi secondi.

aggiornamento (29.12.2010)

Grazie per tutti i vostri commenti e suggerimenti. Ci è voluto un giorno lavorativo per scoprire che la mia ipotesi era sbagliata. Il codice che ho usato ha avuto un "bug" e in effetti diversi calcoli sono stati eseguiti in console e in shell. Quando l'ho risolto, il tempo di calcolo era lo stesso.

Sommario: Il tempo di calcolo di uno script eseguito in console e in shell Java è quasi lo stesso. Il tempo aggiuntivo per inizializzare la comunicazione Java VM e IO è insignificante.

+2

C'è un sacco di IO? O è un processo legato alla CPU? – marcog

+0

È un processo associato alla CPU. Lo script riceve i dati solo all'inizio, ma ciò avviene rapidamente. Dopo di ciò, lo script crea un albero decisionale che richiede molto tempo. – czuk

+0

Cosa stai facendo con 'input' e' error'? Buttandolo via o conservandolo in memoria? E quanti output generate generano questi flussi? – rodion

risposta

2

Provare a utilizzare lo stesso codice senza BufferedReaders e BufferedWriters, nel caso in cui vi sia un ritardo introdotto dal buffering. Non sono sicuro di quanto tempo gli scrittori con buffer aspettino di svuotare, ma per lo meno la loro rimozione aiuterebbe a semplificare il problema.

Problemi correlati