Ho il seguente codice:Perché questo ciclo Parallel.ForEach non migliora le prestazioni?
if (!this.writeDataStore.Exists(mat))
{
BlockingCollection<ImageFile> imageFiles = new BlockingCollection<ImageFile>();
Parallel.ForEach(fileGrouping, fi => DecompressAndReadGzFile(fi, imageFiles));
this.PushIntoDb(mat, imageFiles.ToList());
}
DecompressAndReadGzFile
è un metodo statico nella stessa classe che questo metodo è contenuta nel Come per il nome del metodo che sto decompressione e la lettura di file GZ, molti di loro, vale a dire fino. a 1000, quindi il sovraccarico della parallelizzazione ne vale la pena per i benefici. Tuttavia, non vedo i benefici. Quando utilizzo il profiler delle prestazioni ANTS, vedo che funzionano esattamente nello stesso momento in cui non si verifica alcuna parallelizzazione. Controllo anche i core della CPU con Process Explorer e sembra che ci sia probabilmente del lavoro su due core, ma un core sembra fare la maggior parte del lavoro. Cosa non riesco a capire fino a ottenere Parallel.ForOgni a decomprimere e leggere i file in parallelo?
DOMANDA AGGIORNATA: Qual è il modo più veloce per leggere le informazioni da un elenco di file?
problema (semplificato):
- C'è una lunga lista di file .gz (1200).
- Ogni file ha una riga contenente "DATI:", la posizione e il numero di riga non sono statici e possono variare da file a file.
- Abbiamo bisogno di recuperare il primo numero dopo "DATA:" (solo per semplicità) e riporlo in un oggetto in memoria (ad esempio un elenco)
Nella domanda iniziale, stavo usando il parallelo Per ogni ciclo, ma non sembra che la CPU sia vincolata su più di un core.
C'è qualche sincronizzazione eseguita in 'DecompressAndReadGzFile'? – SimonC
Non che io sappia. Sebbene ci sia una chiamata a imageFiles.Add che aggiunge automaticamente un blocco da ciò che ho capito. – Seth