tengo el siguiente código:¿Por qué este circuito Parallel.ForEach no mejora el rendimiento?
if (!this.writeDataStore.Exists(mat))
{
BlockingCollection<ImageFile> imageFiles = new BlockingCollection<ImageFile>();
Parallel.ForEach(fileGrouping, fi => DecompressAndReadGzFile(fi, imageFiles));
this.PushIntoDb(mat, imageFiles.ToList());
}
DecompressAndReadGzFile
es un método estático en la misma clase que este método está contenida en De acuerdo con el nombre del método que estoy descomprimir y leer archivos gz, muchos de ellos, es decir, hacia arriba. hasta 1000, por lo que la sobrecarga de la paralelización vale la pena por los beneficios. Sin embargo, no veo los beneficios. Cuando uso el analizador de rendimiento ANTS veo que se ejecutan exactamente en el mismo momento que si no se produce una paralelización. También compruebo los núcleos de la CPU con el explorador de procesos y parece que posiblemente se está trabajando en dos núcleos, pero parece que uno de ellos está haciendo la mayor parte del trabajo. ¿Qué no estoy entendiendo en cuanto a obtener Parallel.ForEach para descomprimir y leer archivos en paralelo?
PREGUNTA ACTUALIZADA: ¿Cuál es la forma más rápida de leer información de una lista de archivos?
El problema (simplificado):
- Hay una gran lista de archivos .gz (1200).
- Cada archivo tiene una línea que contiene "DATA:", la ubicación y el número de línea no son estáticos y pueden variar de un archivo a otro.
- Tenemos que recuperar el primer número después de "DATA:" (sólo por razones de simplicidad) y almacenarlo en un objeto en la memoria (por ejemplo, una lista)
En la pregunta inicial, que estaba usando el Paralelo .ForEach loop pero no parecía estar vinculado a la CPU en más de 1 núcleo.
¿Hay alguna sincronización realizada en 'DecompressAndReadGzFile'? – SimonC
No es que yo sepa. Aunque hay una llamada a imageFiles.Add que automáticamente agrega un bloqueo a lo que yo entiendo. – Seth