Questo sembra un problema semplice ma non riesco a capirlo.Scrive i dati in un file hdf utilizzando il multiprocessing
Ho una simulazione che viene eseguita in un ciclo double for e scrive i risultati in un file HDF. Una versione semplice di questo programma è il seguente:
import tables as pt
a = range(10)
b = range(5)
def Simulation():
hdf = pt.openFile('simulation.h5',mode='w')
for ii in a:
print(ii)
hdf.createGroup('/','A%s'%ii)
for i in b:
hdf.createArray('/A%s'%ii,'B%s'%i,[ii,i])
hdf.close()
return
Simulation()
Questo codice non esattamente quello che voglio, ma dal momento che il processo può richiedere un po 'di tempo a correre ho cercato di utilizzare il modulo multiprocessing e utilizzare il seguente codice:
import multiprocessing
import tables as pt
a = range(10)
b = range(5)
def Simulation(ii):
hdf = pt.openFile('simulation.h5',mode='w')
print(ii)
hdf.createGroup('/','A%s'%ii)
for i in b:
hdf.createArray('/A%s'%ii,'B%s'%i,[ii,i])
hdf.close()
return
if __name__ == '__main__':
jobs = []
for ii in a:
p = multiprocessing.Process(target=Simulation, args=(ii,))
jobs.append(p)
p.start()
Questo tuttavia stampa solo l'ultima simulazione sul file HDF, in qualche modo sovrascrive tutti gli altri gruppi.
Come aggiunta a questa domanda ho usato il codice sopra con successo ma ora sto espandendo questa simulazione, il ciclo for definito da a = range (1000) e anche il ciclo for definito da b = range (100). Questo howerver si traduce in un ampio uso della mia memoria. Ho 8 CPU con 16 Gb di RAM ma quando eseguo il file (anche senza le vere simulazioni) il mio utilizzo della RAM va al 100% e il mio sistema si ferma. – user2143958
Penso che sia necessario separare il numero di sottoprocessi dal numero di attività. Sembra che tu voglia 1000 compiti, ma probabilmente non 1000 sottoprocessi. Modificherò il post per suggerire un modo per farlo. – unutbu
Sì, hai ragione, nell'esempio precedente per le iterazioni di grandi dimensioni è stata creata una quantità di subprocessi ugualmente grande che intasava tutta la memoria. Il file che hai modificato funziona perfettamente! Ma solo per chiarimenti, stavo anche sperimentando la funzione Pool() e questa funzione sembra funzionare abbastanza bene anche se diventa più difficile quando è necessario passare più di una variabile. Qual è la ragione principale per scegliere la funzione Process() sulla funzione Pool()? – user2143958