4 Pregunta: Leyendo múltiples archivos en múltiples hilos usando C #, ¡lento!

pregunta creada en Mon, Nov 16, 2009 12:00 AM

Tengo una CPU Intel Core 2 Duo y estaba leyendo 3 archivos de mi unidad C: y mostré algunos valores coincidentes de los archivos en un EditBox en la pantalla. El proceso completo toma 2 minutos. ¡Entonces pensé en procesar cada archivo en un hilo separado y luego el proceso completo está tomando 2.30 minutos! es decir, 30 segundos más que el procesamiento de un solo hilo.

¡Estaba esperando al revés! Puedo ver ambos Gráficos en el historial de uso de la CPU. ¿Alguno, por favor, explícame qué está pasando? Aquí está mi fragmento de código.

 foreach (FileInfo file in FileList)
{

   Thread t  = new Thread(new ParameterizedThreadStart(ProcessFileData));
   t.Start(file.FullName);  

}

donde processFileData es el método que procesa los archivos.

¡Gracias!

    
7
  1. ¿Estás ejecutando tus pruebas de velocidad con las versiones de lanzamiento?
    2009-11-16 04: 48: 29Z
  2. No estoy seguro de si puedes verificar, pero si ambos subprocesos están en el mismo núcleo, no verás muchas mejoras. ¿Ha perfilado su aplicación de subproceso único y multihilo para ver qué está pasando?
    2009-11-16 04: 56: 40Z
  3. ¿Cómo creas el perfil de los hilos?
    2009-11-17 03: 38: 06Z
4 Respuestas                              4                         

La raíz del problema es que los archivos están en la misma unidad y, a diferencia de su procesador de doble núcleo, su unidad de disco duro solo puede hacer una cosa a la vez.

Si lees dos archivos a la vez, las cabezas de los discos saltarán de un archivo a otro y regresarán. Dado que su disco duro puede leer cada archivo en aproximadamente 40 segundos, ahora tiene la sobrecarga adicional de mover su cabeza de disco entre los tres archivos separados muchas veces durante la lectura.

La forma más rápida de leer varios archivos desde un solo disco duro es hacerlo todo en un hilo y leerlos uno tras otro. De esta manera, la cabeza solo se mueve una vez por archivo leído (al principio) y no varias veces por lectura.

Para optimizar este proceso, deberá cambiar su lógica (¿realmente necesita leer el contenido completo de los tres archivos?). O compre un disco duro más rápido /coloque los 3 archivos en tres discos duros diferentes y use subprocesos /use una redada.

    
11
2009-11-16 05: 10: 39Z
  1. + 1: no pensé que estuvieran en el mismo disco.
    2009-11-16 05: 11: 51Z
  2. ¿El rendimiento aumentaría si cada archivo se leyera y se colocara en una cadena?
    2009-11-16 05: 23: 16Z
  3. Claro, si estabas leyendo los archivos varias veces para realizar una coincidencia, definitivamente los pones en la memoria y usas muchos núcleos, ya que debes buscarlos. Sin embargo, si solo las busca una vez y puede detenerlas si se encuentra una coincidencia, será mucho más rápido intentar hacer coincidencias mientras lee, de modo que pueda detener la lectura si se encuentra una coincidencia. La lectura de HD es aproximadamente 1000X más lenta que la de RAM, por lo que si puede detener la lectura del archivo de forma parcial si se encuentra una coincidencia, es un gran ahorro de tiempo.
    2009-11-16 06: 21: 42Z
  4. ¿Alguien ha intentado la E /S del disco de subprocesos múltiples en una unidad de estado sólido?
    2011-06-08 14: 30: 48Z

Si lees desde el disco utilizando varios subprocesos, las cabezas del disco rebotarán de una parte del disco a otra.como cada hilo se lee desde una parte diferente de la unidad. Eso puede reducir significativamente el rendimiento, como ha visto.

Por esa razón, a menudo es mejor tener todos los accesos a los discos a través de un solo hilo, para ayudar a minimizar las búsquedas de discos.

Si su tarea está vinculada a E /S y necesita ejecutarse con frecuencia, puede consultar una herramienta como "contig" para asegurarse de que el diseño de sus archivos en el disco esté optimizado /contiguo.

    
3
2009-11-16 05: 06: 06Z

Si el procesamiento es mayormente de IO enlazado y de CPU, tiene sentido que tome el mismo tiempo o incluso más.

¿Cómo comparas esos archivos? Usted debe pensar cuál es el cuello de botella de su aplicación? Salida /entrada IO, CPU, memoria ...

El subprocesamiento múltiple solo es interesante para el procesamiento enlazado de la CPU. es decir, cálculo complejo, comparación de datos en la memoria, clasificación, etc. ...

    
1
2009-11-16 04: 56: 16Z

Dado que su proceso está enlazado a IO, debe dejar que el sistema operativo haga su trabajo por usted. Mire FileStream.BeginRead () para ver un ejemplo de cómo poner en cola sus lecturas. Su método EndRead () puede activar su próxima solicitud para leer el siguiente bloque de datos que apunta a sí mismo para manejar cada bloque completado subsiguiente.

Además, al crear subprocesos adicionales, el sistema operativo debe administrar más subprocesos. Y si una CPU diferente es elegida para manejar la lectura completa, ha perdido todo el almacenamiento en caché de la CPU donde se originó el subproceso.

Como has encontrado, no puedes "acelerar" una aplicación simplemente agregando hilos.

    
0
2009-11-16 05: 01: 32Z
fuente colocada aquí