Mi programa lee archivos de texto línea por línea extrayendo tipos específicos de palabras en cada línea (es importante en qué línea se encontró la palabra). ¿Qué sería mejor, separar los hilos por archivos (cada hilo leería un archivo diferente) o separarlos por líneas (cada hilo leería una línea diferente del mismo archivo)?

1
Peace Master 25 ene. 2016 a las 20:28

3 respuestas

La mejor respuesta

A menos que tenga varios discos duros, probablemente ninguno.

El disco duro es intrínsecamente de un solo subproceso, es decir, produce solo un flujo de datos en un momento dado. Con un disco duro real con un disco giratorio y una cabeza que busca alrededor del disco, su mejor rendimiento generalmente vendrá de la lectura secuencial. Buscar en el archivo o entre archivos separados a diferentes lugares puede reducir sustancialmente el rendimiento.

Si tiene varias unidades, entonces dependerá de cómo se distribuyan sus datos en las unidades, pero lo ideal es que desee algo así como un hilo dedicado a leer datos de cada unidad física.

Si tiene suficiente procesamiento para hacer en los datos una vez que se leen, puede hacer que un solo hilo lea los datos y los coloque en una especie de cola segura para hilos. Desde allí, tiene subprocesos de procesamiento que toman elementos de datos individuales, los procesan y escriben el resultado en ... donde desee su salida.

Si se trata de volver a un archivo (o varios archivos), probablemente desee más o menos lo contrario aquí: un solo hilo para escribir la salida en cada disco de resultados, y los hilos de procesamiento depositan sus datos en algún tipo de cola. En un caso típico, será una cola de prioridad ordenada por el orden en que los datos deben escribirse en el archivo de salida, por lo que el hilo de salida siempre escribe los datos de forma secuencial.

3
Jerry Coffin 25 ene. 2016 a las 18:06

Depende de cuántos archivos hay y cuántas líneas hay por archivo.

Si tiene relativamente pocas líneas en cada archivo, entonces la paralelización no valdrá la pena. Lo mismo ocurre si maneja relativamente pocos archivos.

Siempre se pueden paralelizar a ambos.

2
Maxi Clayton Clowes 25 ene. 2016 a las 17:32

Como siempre en las preguntas de desempeño, probablemente debería probar ambos y medir si es posible. Pero esto es lo que dicen mis intuiciones:

Si los archivos tienen un tamaño similar / tardan un tiempo similar en procesarse, probablemente sea mejor asignar a cada hilo su propio archivo.

Muchos subprocesos que acceden a un archivo probablemente solo valgan la pena si el tiempo de cálculo domina el tiempo de E / S del archivo.

Pero de nuevo, debes medir. Adivinar sobre el rendimiento sale mal con bastante frecuencia. Como @Jerry Coffin señala, es muy posible que ninguno de los dos le ayude, pero por otro lado, es posible que los archivos ya estén precargados en la RAM, en cuyo caso este punto puede aplicarse o no (en su totalidad). Realmente, solo intenta ver. Este es un campo amplio y difícil de predecir.

3
Baum mit Augen 10 oct. 2019 a las 22:01