ho writen un programma che può essere riassunta come segue:Python utilizzo della memoria multiprocessing
def loadHugeData():
#load it
return data
def processHugeData(data, res_queue):
for item in data:
#process it
res_queue.put(result)
res_queue.put("END")
def writeOutput(outFile, res_queue):
with open(outFile, 'w') as f
res=res_queue.get()
while res!='END':
f.write(res)
res=res_queue.get()
res_queue = multiprocessing.Queue()
if __name__ == '__main__':
data=loadHugeData()
p = multiprocessing.Process(target=writeOutput, args=(outFile, res_queue))
p.start()
processHugeData(data, res_queue)
p.join()
Il vero codice (soprattutto'writeOutput() ') è molto più complicato. 'writeOutput() 'utilizza solo questi valori che assume come argomenti (ovvero non fa riferimento a hadata')
In pratica carica un enorme set di dati in memoria e lo elabora. La scrittura dell'output è delegata a un processo secondario (scrive in più file in realtà e ciò richiede molto tempo). Quindi, ogni volta che viene elaborato un elemento di dati, viene inviato al processo secondario tramite res_queue che a sua volta scrive il risultato in file, se necessario.
Il processo secondario non ha bisogno di accedere, leggere o modificare i dati caricati da "loadHugeData()" in alcun modo. Il processo secondario deve solo utilizzare ciò che il processo principale invia tramite'res_queue'. E questo mi porta al mio problema e alla mia domanda.
Mi sembra che il processo secondario ottenga la copia dell'enorme set di dati (quando si controlla l'utilizzo della memoria con'top'). È vero? E se è così allora come posso evitare id (usando essenzialmente la doppia memoria)?
Sto usando Python 2.6 e il programma è in esecuzione su linux.
Riesci a ristrutturare il codice per utilizzare gli iteratori invece di caricare tutto il carico di HugeData? Sembrerebbe che si potrebbe se è come sembra caricare/elaborare/accodare/dequeue/scrivere – sotapme
Il "hugeData" è purtroppo un file txt separato da tabulazioni che contiene fondamentalmente un array sparse. E ho bisogno di "accesso casuale" a questi dati in base al numero di linea durante l'elaborazione. Pertanto caricarlo in memoria (con ottimizzazioni specifiche per array sparsi) rende l'elaborazione molto più veloce. – FableBlaze
Potrebbe essere eccessivamente ingegneristico suggerire di usare qualcosa come '[beanstalkd] (https://github.com/earl/beanstalkc/blob/master/TUTORIAL.mkd) per fare l'integrazione del processo ma sarebbe interessante sapere se ha aiutato/ridimensionato/perfomed. Come al solito i problemi degli altri sono sempre più interessanti. – sotapme