Actualmente estoy diseñando una aplicación que tiene un módulo que cargará grandes cantidades de datos de una base de datos y los reducirá a un conjunto mucho más pequeño según varios cálculos, según las circunstancias.¿Cómo le digo a una máquina multi-core/multi-CPU que procese llamadas de función en un bucle en paralelo?
Muchas de las operaciones más intensivas se comportan de manera determinista y se prestan a un procesamiento paralelo.
Siempre que tenga un ciclo que itere sobre una gran cantidad de fragmentos de datos que llegan del DB y para cada uno llame a una función determinística sin efectos secundarios, ¿cómo lo haré para que el programa no espere a que la función volver, pero más bien establece las próximas llamadas en marcha, por lo que podrían procesarse en paralelo? Un enfoque ingenuo para demostrar el principio me haría por ahora.
He leído el documento de MapReduce de Google y si bien podría utilizar el principio general en varios lugares, por ahora, no me enfocaré en grandes grupos, sino que será un solo multi-core o multi-CPU máquina para la versión 1.0. Por lo tanto, actualmente no estoy seguro de si realmente puedo usar la biblioteca o tendré que rodar una versión básica embrutecida.
Estoy en una etapa inicial del proceso de diseño y hasta ahora estoy apuntando a C-algo (para los bits críticos de velocidad) y Python (para los bits críticos de productividad) como mis idiomas. Si hay razones convincentes, podría cambiar, pero hasta ahora estoy contento con mi elección.
Tenga en cuenta que soy consciente de que podría llevar más tiempo recuperar el siguiente fragmento de la base de datos que procesar el actual y todo el proceso estaría vinculado a E/S. Sin embargo, supongo que por el momento no es así y, en la práctica, utilizo un clúster de db o almacenamiento en memoria caché u otra cosa para no estar enlazado a E/S en este punto.
Podría actualizar el texto para agregar un enlace al documento google mapreduce, creo que es un recurso excelente (http://labs.google.com/papers/mapreduce.html). –