2010-07-13 13 views
6

Me pregunto si el paralelo File.Read usando PLINQ/Paralelo puede ser más rápido? Mi código es el siguiente (.Net 4.0):¿Es el archivo paralelo.Leer más rápido que la lectura secuencial?

public static void ReadFileParallel(List<string> fileName) 
{ 
    Parallel.Foreach(fileName, file=>File.Read(file)); 
} 

public static void ReadFilePLINQ(List<string> fileName) 
{ 
    fileName.AsParallel().foreach(file=>File.Read(file)); 
} 

La razón que pido esto es porque pensaba que la lectura de archivos está obligado IO, al hacerlo paralelo no va a ayudar, ¿verdad?

Respuesta

6

Depende.

Si sus archivos se encontraban en ubicaciones diferentes, en diferentes recursos compartidos de red o en diferentes discos duros físicos, entonces sí, la carga en paralelo probablemente sea útil. Si están en un único disco duro giratorio, leer los archivos en paralelo probablemente perjudicará su rendimiento significativamente debido al tiempo extra de búsqueda que probablemente incurrirá en estas lecturas paralelas.

Si sus archivos están en una SSD, es probable que obtenga un rendimiento ligeramente menor, pero esto dependerá de la cantidad de archivos que está leyendo en paralelo y cuáles son sus tamaños. Me imagino que con un cierto umbral de tamaño de archivo y número de lecturas paralelas, el rendimiento disminuirá significativamente. Difícil de decir sobre eso sin algo de experimentación.

+1

Esos son criterios razonables. En la práctica, yo diría que lo miden en lugar de adivinarlo. –

1

Lo pensaría, pero eso no es lo que muestran las mediciones. Cuando la E/S de archivos tiene una latencia significativa, particularmente en redes, hacerlo en paralelo puede mantener la tubería llena.

0

Para una primera aproximación, ayudará si los archivos están en discos diferentes y lo harán más lento de lo contrario (debido al aumento del tiempo dedicado a la búsqueda).

Puede ser un poco más rápido si todos los archivos están en caché (ya que puede usar varios núcleos).

Su mejor apuesta es, por supuesto, ejecutar algunos puntos de referencia.

0

No está haciendo exactamente un File.Read en paralelo, está haciendo varias File.Reads en paralelo. Si los archivos están en husos diferentes, experimentará un rendimiento mejorado al utilizar múltiples husillos a la vez.

También puede experimentar un rendimiento mejorado incluso si se utiliza un solo husillo, si cada lectura es seguida de procesamiento de la CPU de ruedas, aunque en este caso sería mucho mejor y los objetos programar tareas. En este caso, puede tener algunas tareas cargando datos de archivos, mientras que otras utilizan datos ya cargados para ejecutar un procesamiento pesado.

+0

Sí, pero si sus archivos están en el mismo HDD, alcanzará el tiempo de búsqueda principal, y el rendimiento disminuirá mucho peor que 2 veces. Recuerde que el tiempo de búsqueda promedio para un disco de 3.5 "7200 RPM es de 13-15 milisegundos. Y a diferencia de la capacidad y la tasa de lectura/escritura lineal, esta cifra es constante en los últimos años. – Soonts

+0

Es por eso que dije" cada lectura seguida de Procesamiento vinculado a CPU ". Mientras un hilo está leyendo el archivo, otro está procesando, manteniendo ambos trabajando. –

0

Creo que ya has dado un golpe en la cabeza.

Paralelo Las operaciones en general son siempre estranguladas por el punto en el que se agotan los recursos para ejecutar las operaciones en paralelo, pero aun así usted todavía tiene rendimientos decrecientes en una cantidad creciente de hilos paralelos.

Jeff Atwood publicó un gráfico interesante que añadiré a esto más adelante mostrando los rendimientos decrecientes de los procesadores mutli-core con un entorno multi-threading. De acuerdo, esto no es exactamente lo mismo. Pero echemos un vistazo a esto desde la idea de que incluso si tuviera 100 archivos en 100 discos duros, en algún lugar que IO se vuelve a bajar un solo canal, lo que disminuirá un poco el aumento de lectura.

Lo que básicamente trato de decir es que ejecutar algo en paralelo no significa que se acelerará drásticamente, es importante considerar cómo se están ejecutando realmente los procesos paralelos.

0

Es un asunto complicado. Si lo hace mal, la cabeza del disco se mueve hacia adelante y hacia atrás tratando de leer dos archivos al mismo tiempo. Esto es especialmente un problema en archivos más grandes.

Sin embargo, si lee muchos archivos pequeños en paralelo, puede ganar un poco porque el subsistema de discos puede elegir leer los archivos en un orden diferente al que solicitó. Sin embargo, no he visto este efecto en la vida real.

También se puede hacer el procesamiento en el contenido en paralelo con la lectura de los archivos. Por lo tanto, necesita hacer un perfil y un punto de referencia antes de enviar.

Cuestiones relacionadas