2011-03-17 13 views
5

Necesito escribir un servicio C# (podría ser un servicio de Windows o una aplicación de consola) que necesita procesar grandes cantidades de datos (100 000 registros) almacenados en una base de datos. Procesar cada registro es también una operación bastante compleja. Necesito realizar muchas inserciones y actualizaciones como parte del proceso.Procesando grandes cantidades de datos usando multiprocesamiento

Estamos utilizando NHibernate como el ORM.

Una forma es cargar todos los registros y procesarlos secuencialmente ... lo que podría ser bastante lento. Estaba buscando opciones de múltiples subprocesos y estaba pensando en tener múltiples hilos procesando trozos de registros simultáneamente.

Podría alguien darme algunos consejos sobre cómo debería abordar este .. teniendo en cuenta que estoy usando NHibernate y cuáles son las posibles trampas como estancamiento etc

muchas gracias.

+0

Pequeño punto no relacionado: su pregunta no es realmente una pregunta 'C#', por lo que probablemente elimine esa etiqueta; y ya que mencionaste NHibernate y debido a la naturaleza de la pregunta, probablemente agregaría eso como una etiqueta. Si desea transmitir que está en .NET, agregue una etiqueta .NET. – DuckMaestro

+0

Gracias ... punto tomado :) – Sennin

+0

¿Dónde está almacenando los datos que ha procesado? 100.000 declaraciones de actualización separadas matarán tu base de datos. –

Respuesta

0

Parece que PLINQ es la mejor solución (Chapter 5 in this article). Pero como cada cálculo está trabajando mucho con la base de datos, debe crear una sesión separada para cada hilo.

2

Suponiendo que está utilizando .NET 4.0, puede utilizar la tarea paralela Biblioteca (como se ha dicho) para hacer algo como esto:

Parallel.ForEach(sourceCollection, item => Process(item)); 

Su colección de origen sería un IEnumerable de los registros cargados. La biblioteca se encargará de todo por usted:

La colección de origen está particionada y el trabajo está programado en varios subprocesos según el entorno del sistema. Cuantos más procesadores haya en el sistema, más rápido se ejecutará el método paralelo.

Puede ser útil leer a tutorial on using Parallel.ForEach(). Además, tenga en cuenta potential pitfalls.

+0

Gracias Jon y todos ustedes por sus sugerencias. Solo estoy mirando la biblioteca paralela de tareas. Me pregunto cómo gestionaría las sesiones de NHibernate aquí ya que no tengo control sobre los hilos paralelos. Idealmente, me gustaría que cada hebra paralela tenga su propia sesión. ¿Alguna idea de cómo se puede lograr eso con TPL? – Sennin

0

Use IStatelessSessions si es posible y experimente con la propiedad adonet.batch_size.

¿Qué tan eficiente debe ser? Soy fanático de NH pero este es un escenario donde los procedimientos almacenados pueden ser mejores

+1

Se requiere un alto rendimiento como siempre :) .. sin embargo, no estoy muy interesado en mover toda la lógica de negocios a un sproc – Sennin

Cuestiones relacionadas