Mam następujący kod:Dlaczego ta pętla Parallel.ForEach nie poprawia wydajności?
if (!this.writeDataStore.Exists(mat))
{
BlockingCollection<ImageFile> imageFiles = new BlockingCollection<ImageFile>();
Parallel.ForEach(fileGrouping, fi => DecompressAndReadGzFile(fi, imageFiles));
this.PushIntoDb(mat, imageFiles.ToList());
}
DecompressAndReadGzFile
jest metodą statyczną w tej samej klasie, że metoda ta jest zawarta w Zgodnie z nazwą metody ja dekompresji i odczytu plików gz, wiele z nich, to znaczy w górę. do 1000, więc narzut równoległości jest warty dla korzyści. Jednak nie widzę korzyści. Kiedy używam profilera wydajności ANTS widzę, że działają one dokładnie w tych samych czasach, jak gdyby nie wystąpiła równoległość. Sprawdzam również rdzenie procesora za pomocą eksploratora procesów i wygląda na to, że prawdopodobnie praca jest wykonywana na dwóch rdzeniach, ale jeden rdzeń wydaje się wykonywać większość pracy. Czego nie rozumiem, jeśli chodzi o równoległe dekompresowanie i odczytywanie plików Parallel.ForEach?
ZAKTUALIZOWANE PYTANIE: Jaki jest najszybszy sposób na odczytanie informacji z listy plików?
Problem (uproszczony):
- Istnieje duża lista plików .gz (1200).
- Każdy plik ma wiersz zawierający "DATA:", lokalizacja i numer linii nie są statyczne i mogą się różnić w zależności od pliku.
- Musimy odzyskać pierwszy numer po „dane” (tylko dla uproszczenia) i przechowywać go w obiekt w pamięci (np List)
W pierwszym pytaniu używałem równoległym .Dla pętli, ale nie wydaje mi się, aby procesor był związany z więcej niż 1 rdzeniem.
Czy synchronizacja została wykonana w 'DecompressAndReadGzFile'? – SimonC
Nie jestem tego świadomy. Chociaż istnieje wywołanie funkcji imageFiles.Add, która automatycznie dodaje blokadę z tego, co rozumiem. – Seth