He escrito un algoritmo que toma datos geoespaciales y realiza una serie de pasos. Los datos de entrada son un shapefile de polígonos y rásteres de covarianza para un área de estudio de ráster grande (~ 150 millones de píxeles). Los pasos son como sigue:Diseño multiproceso de Python
- puntos de muestra desde el interior de polígonos de la shapefile
- para cada punto de muestreo, los valores de extracto de los rasters de covarianza
- construir un modelo predictivo en los puntos de muestreo
- Extraer covariables para la matriz de objetivos de puntos
- Aplicar modelo predictivo para apuntar rejilla
- predicciones escribir en un conjunto de rejillas de salida
El proceso completo debe repetirse varias veces (digamos 100) pero cada iteración actualmente demora más de una hora cuando se procesa en serie. Para cada iteración, las partes que consumen más tiempo son los pasos 4 y 5. Debido a que la cuadrícula de destino es tan grande, he estado procesando un bloque (digamos 1000 filas) a la vez.
tengo una CPU de 6 núcleos con 32 Gb RAM, por lo que dentro de cada iteración, que tenía un ir en utilizando el módulo de Python multiprocessing
con un objeto Pool
para procesar un número de bloques de forma simultánea (etapas 4 y 5) y luego escribir la salida (las predicciones) al conjunto común de cuadrículas de salida utilizando una función de devolución de llamada que llama a una función de escritura de salida global. Esto parece funcionar, pero no es más rápido (en realidad, es probablemente más lento) que procesar cada bloque en serie.
Así que mi pregunta es, ¿hay una forma más eficiente de hacerlo? Estoy interesado en la clase Queue
del módulo de multiprocesamiento, pero no estoy muy seguro de cómo funciona. Por ejemplo, me pregunto si es más eficiente tener una cola que lleva a cabo los pasos 4 y 5, luego pasa los resultados a otra cola que lleva a cabo el paso 6. ¿O esto es para qué sirve Queue?
Cualquier puntero sería apreciado.
¿Cuál es el RSS máximo durante todo el proceso? Tal vez sería más fácil simplemente ejecutar esto seis veces al mismo tiempo si todo encajaría en la memoria ... – sarnold
¿De verdad estás atado a la CPU? Esto parece un problema de E/S encuadernado. – stark
@Sarnold: No todo encajará en la memoria, ese es el problema ... – hendra