Ho scritto un algoritmo che acquisisce dati geospaziali ed esegue una serie di passaggi. I dati di input sono uno shapefile di poligoni e raster covariati per un'area di studio raster di grandi dimensioni (~ 150 milioni di pixel). I passi sono i seguenti:Progettazione multiprocessing Python
- punti del campione dall'interno poligoni dello shapefile
- Per ogni punto di campionamento, i valori estratto del raster covariate
- costruire un modello predittivo sui punti di campionamento
- covariate Estratto per griglia di destinazione punti
- Applicare modello predittivo per indirizzare griglia
- previsioni scrittura a una serie di griglie di uscita
L'intero processo deve essere ripetuto un numero di volte (ad esempio 100) ma ogni iterazione richiede attualmente più di un'ora quando viene elaborata in serie. Per ogni iterazione, le parti che richiedono più tempo sono i passaggi 4 e 5. Poiché la griglia di destinazione è così grande, l'ho elaborata in blocco (ad esempio 1000 righe) alla volta.
ho una CPU 6-core con 32 Gb RAM, quindi all'interno di ogni iterazione, ho avuto un andare a utilizzando moduli di Python multiprocessing
con un oggetto Pool
per elaborare un numero di blocchi contemporaneamente (passaggi 4 e 5) e poi scrivere l'output (le previsioni) al set comune di griglie di output utilizzando una funzione di callback che chiama una funzione di scrittura di output globale. Questo sembra funzionare, ma non è più veloce (in realtà, è probabilmente più lento) rispetto all'elaborazione di ogni blocco in serie.
Quindi la mia domanda è, c'è un modo più efficiente per farlo? Sono interessato alla classe Queue
del modulo multiprocessing, ma non sono sicuro di come funzioni. Ad esempio, mi chiedo se è più efficiente avere una coda che esegue i passaggi 4 e 5, quindi passa i risultati a un'altra coda che esegue il passaggio 6. O è anche ciò che è per Queue?
Qualsiasi suggerimento sarebbe apprezzato.
Qual è il massimo RSS durante l'intero processo? Forse sarebbe più semplice eseguire questa cosa sei volte contemporaneamente se tutto andasse bene nella memoria ... – sarnold
Sei davvero legato alla CPU? Questo sembra un problema legato all'I/O. – stark
@Sarnold: non si adatta alla memoria, questo è il problema ... – hendra