Почему этот цикл Parallel.ForEach не улучшает производительность?

У меня есть следующий код:

           if (!this.writeDataStore.Exists(mat))
            {
                BlockingCollection<ImageFile> imageFiles = new BlockingCollection<ImageFile>();
                Parallel.ForEach(fileGrouping, fi => DecompressAndReadGzFile(fi, imageFiles));


                this.PushIntoDb(mat, imageFiles.ToList());
            }

DecompressAndReadGzFile - статический метод в том же классе, в котором содержится этот метод. В соответствии с названием метода я распаковываю и читаю файлы gz, многие из них, т. Е. до 1000, поэтому накладные расходы на распараллеливание того стоят. Однако я не вижу преимуществ. Когда я использую профилировщик производительности ANTS, я вижу, что они выполняются точно в то же время, как если бы распараллеливания не происходит. Я также проверяю ядра процессора с помощью проводника процессов, и похоже, что, возможно, работа выполняется над двумя ядрами, но одно ядро, похоже, делает большую часть работы. Чего я не понимаю, как заставить Parallel.ForEach распаковывать и читать файлы параллельно?

ОБНОВЛЕННЫЙ ВОПРОС: Каков самый быстрый способ чтения информации из списка файлов?

Проблема ( упрощено):

  1. Есть большой список файлов .gz (1200).
  2. В каждом файле есть строка, содержащая «ДАННЫЕ:», расположение и номер строки не являются статическими и могут варьироваться от файла к файлу.
  3. Нам нужно получить первое число после «DATA:» (просто для простоты) и сохранить его в объекте в памяти (например, в списке)

В начальном вопросе я использовал цикл Parallel.ForEach но мне показалось, что процессор не привязан более чем к 1 ядру.

5
задан Soner Gönül 11 November 2011 в 08:04
поделиться