PROBLEMA help da Java a Python

mariange92

Nuovo Utente
14
0
Buongiorno,
sto sviluppando un progetto e sto riscontrando dei problemi. Devo lanciare più istanze di un software in parallelo su una macchina virtuale, andando a creare uno script che consenta ciò. Il problema è che questo software (si chiama OS-Analyzer) funziona da terminale e generalmente lo lancio su windows o anche linux mediante il comando java-jar, e su python?? qual è il rispettivo comando? come faccio a dire a lanciare più istanze di questo software su python?
vi ringrazio
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Ma la domanda quindi qual è? Come lanciare uno script python?
Codice:
python <nomescript.py> [args]
Non ho capito come pensi di gestire il "parallelismo" di queste istanze, le vuoi semplicemente lanciare più volte dalla console? In questo caso ti basta eseguire il comando sopra tutte le volte che ti serve.
 

mariange92

Nuovo Utente
14
0
Mi spiego meglio.. Ho un software che si chiama osanalyzer e ho un dataset grande.. Devo dividere questo dataset e dare ogni singola riga di questo, in input a un istanza del software e poi salvare ogni singolo output. La mia domanda è come faccio a lanciare questo software su python, generando le istanze?? Perché da cmd lo lancio mediante mediante Java-jar, da python non ci riesco
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Continuo ad essere un po' confuso...
Se ho ben capito esiste un software che si chiama OSAnalyzer (ambito bioinformatico?) che devi lanciare una volta per ogni riga di un dataset.
Quindi devi prendere una riga dal dataset e dargliela in input al programma?
Puoi scrivere uno script in python che legge il dataframe e per ogni riga lancia una istanza del programma passando la riga come input.
Però io non conosco il software, non ho la minima idea di come si aspetta l'input (da riga di comando o da file?) ne' come produce l'output. Non posso dettagliare ulteriormente la mia risposta perchè servono più informazioni.
 
Ultima modifica:

mariange92

Nuovo Utente
14
0
esatto, ho questo software e un dataset contenente dati genomici. Devo fare tutto da linea di comando, ovvero dividere questo dataset e lanciare più istanze, ognuna delle quali dovrà avere in input l'i-esima riga di questo dataset. Ovviamente la singola istanza dovrà calcolare il log-rank (tipico del software) e andrà a generare n output che dovrò salvare in un .Text.. Tutto questo in pratica perché lo scopo è calcolare il tempo d partizionamento del dataset e anxhe il tempo di esecuzione di ogni singola istanza. Però da linea di comando va fatto il tutto (dal terminale di una VM) o al massimo mediante uno script python che dovrò poi lanciare sempre sulla macchina virtuale (in realtà non so se questa alternativa sia la migliore, rispetto che fare tutto direttamente da terminale) .. Non so se mi sono spiegata adesso
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Assumendo che il software in questione sia questo https://sites.google.com/site/overallsurvivalanalyzer/ non mi è chiaro se è possibile avviarlo da riga di comando specificando i parametri. Così ad occhio mi sembra un tool con sola interfaccia grafica per cui temo che non si riesca ad automatizzare un gran che... devi sempre specificare manualmente dall'interfaccia grafica i file di input e poi gestirti l'output.
Per intenderci, ti servirebbe la possibilità di scrivere qualcosa del tipo:
Codice:
java -jar OS-Analyzer1.0.jar --input riga_0.txt --ouput out_0.txt
ma non mi sembra sia possibile (o, se lo è, non è chiaro).
 

mariange92

Nuovo Utente
14
0
In teoria c'è questo comando che ti mostro che prende in input un piccolo dataset, elabora e salva i risultati in un .Txt..
Il comando è questo :
java -Xmx8G -jar ./OSATester.java pathInputDataset.txt 1 pathDeiRisultati.txt

dove pathInputDataset è il percorso del file di input, mentre pathDeiRisultati.txt è il percorso di output dove osAnalyzer andrà a salvare i risultati.
Ti premetto che non mi da errore ma mi appare un qualcosa relativo a Java che non so come risolvere ma che in qualche modo vedrò. Ad ogni modo, siccome devo dividere il dataset e poi dare ogni riga in pasto alla singola istanza, come faresti questa divisione in python? Che istruzione useresti? Ho visto che ci sono diverse opzioni ma non so quale sia la migliore per ciò che devo fare io.. Perché divido in dataset in n dataset piccoli e salvati, dovrei prendere ogni riga e appunto lanciare l'istanza.
 

pabloski

Utente Èlite
2,868
916
Quindi alla fin fine si tratta di prendere il dataset e spezzettarlo in più file che ne contengono vari pezzi. La divisione è già fatta, la farai a mano o vuoi farla in Python? Il come farla in Python dipende dal formato del dataset.

Per quanto riguardo il lancio di processi concorrenti, quella riga che usi da terminale puoi usarla benissimo in Python

Codice:
os.system("java -Xmx8G -jar blah blah")

Riguardo i messaggi che Java dà, di che si tratta? Insomma riesce ad avviare manualmente il programma o no?
 
  • Mi piace
Reazioni: Andretti60

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
In teoria c'è questo comando che ti mostro che prende in input un piccolo dataset, elabora e salva i risultati in un .Txt..
Il comando è questo :
java -Xmx8G -jar ./OSATester.java pathInputDataset.txt 1 pathDeiRisultati.txt

dove pathInputDataset è il percorso del file di input, mentre pathDeiRisultati.txt è il percorso di output dove osAnalyzer andrà a salvare i risultati.
Ti premetto che non mi da errore ma mi appare un qualcosa relativo a Java che non so come risolvere ma che in qualche modo vedrò. Ad ogni modo, siccome devo dividere il dataset e poi dare ogni riga in pasto alla singola istanza, come faresti questa divisione in python? Che istruzione useresti? Ho visto che ci sono diverse opzioni ma non so quale sia la migliore per ciò che devo fare io.. Perché divido in dataset in n dataset piccoli e salvati, dovrei prendere ogni riga e appunto lanciare l'istanza.
In teoria o in pratica? :D
Sto provando il software con un database scaricabile dal sito ufficiale e quell'istruzione si limita ad aprire l'interfaccia ma non fa niente altro, devo sempre usare la GUI per selezionare il file. Ho idea che non processi proprio gli argomenti in input, infatti anche se gli do come input file inesistenti, non batte ciglio.
Sei sicura che quel software funzioni anche da riga di comando?

per quanto riguarda lo split delle righe, farlo in python è banale, però bisogna capire come il software si aspetta l'input. Per esempio del dataset scaricato ci sono ben 6 righe distinte di header, vanno ripetute per ogni file?
 

mariange92

Nuovo Utente
14
0
In teoria o in pratica? :D
Sto provando il software con un database scaricabile dal sito ufficiale e quell'istruzione si limita ad aprire l'interfaccia ma non fa niente altro, devo sempre usare la GUI per selezionare il file. Ho idea che non processi proprio gli argomenti in input, infatti anche se gli do come input file inesistenti, non batte ciglio.
Sei sicura che quel software funzioni anche da riga di comando?

per quanto riguarda lo split delle righe, farlo in python è banale, però bisogna capire come il software si aspetta l'input. Per esempio del dataset scaricato ci sono ben 6 righe distinte di header, vanno ripetute per ogni file?


Conosco poco il software, però mi è stato dato questo comando dicendomi che siccome la versione attuale di osanalyzer è interattiva, c'è questa versione di osanalyzer a linea di comando, facilmente invocabile da script, senza interfaccia grafica, che legge il file input, calcola, e salva un file output. Quindi penso che diviso il dataset e presa poi ogni singola riga che dovrà essere salvata su un file, questa riga debba essere inserita nel comando e quindi viene generato un output contenente il log rank (tipico del software)
 

mariange92

Nuovo Utente
14
0
Quindi alla fin fine si tratta di prendere il dataset e spezzettarlo in più file che ne contengono vari pezzi. La divisione è già fatta, la farai a mano o vuoi farla in Python? Il come farla in Python dipende dal formato del dataset.

Per quanto riguardo il lancio di processi concorrenti, quella riga che usi da terminale puoi usarla benissimo in Python

Codice:
os.system("java -Xmx8G -jar blah blah")

Riguardo i messaggi che Java dà, di che si tratta? Insomma riesce ad avviare manualmente il programma o no?


no la divisione la devo fare io con python, considerando che il file che ho è .txt.. Inoltre mi da un problema per quanto riguarda la dimensione del heap, che supera la dimensione massima di memoria heap gestibile a Java sulla macchina. il problema è che provo a cambiare le impostazioni di java modificando l'heap ma nulla. non so come mai.. bu
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Una cosa del genere assume che ci siano un certo numero di righe di header in cima al file che vanno ripetute per tutti i file splittati.
La gestione dei path di input e output è basilare, probabilmente vorrai poter passare degli argomenti allo script python per parametrizzare il comportamento dello script (input, output, numero split...)
Python:
import os

n_righe_header = 6
n_split = 5
input_file = 'InputDataset.txt'

with open(input_file,'rt') as indata:
    rows = indata.read().splitlines()
  
#header da ripetere in ogni file
header = '\n'.join(rows[:n_righe_header])
#righe di input
rows = rows[n_righe_header:]
outputs = [header]*n_split
for r, row in enumerate(rows):
    outputs[r % n_split] = '\n'.join([outputs[r % n_split], row])

for o, output in enumerate(outputs):
    with open('tmpdata_{}.txt'.format(o),'wt') as tmpdata:
        tmpdata.write(output)
    os.system('java -Xmx8G -jar OSATester.java tmpdata_{o}.txt out_{o}.txt'.format(o = o))
 

mariange92

Nuovo Utente
14
0
Una cosa del genere assume che ci siano un certo numero di righe di header in cima al file che vanno ripetute per tutti i file splittati.
La gestione dei path di input e output è basilare, probabilmente vorrai poter passare degli argomenti allo script python per parametrizzare il comportamento dello script (input, output, numero split...)
Python:
import os

n_righe_header = 6
n_split = 5
input_file = 'InputDataset.txt'

with open(input_file,'rt') as indata:
    rows = indata.read().splitlines()
 
#header da ripetere in ogni file
header = '\n'.join(rows[:n_righe_header])
#righe di input
rows = rows[n_righe_header:]
outputs = [header]*n_split
for r, row in enumerate(rows):
    outputs[r % n_split] = '\n'.join([outputs[r % n_split], row])

for o, output in enumerate(outputs):
    with open('tmpdata_{}.txt'.format(o),'wt') as tmpdata:
        tmpdata.write(output)
    os.system('java -Xmx8G -jar OSATester.java tmpdata_{o}.txt out_{o}.txt'.format(o = o))



Diciamo che lo scopo è lanciare più istanze del software e farle lavorare in parallelo, dando a ogni istanza una riga del dataset.. Si potrebbe poi andare a calcolare il tempo di partizionamento del dataset o di esecuzione delle istanze...
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!