2015-02-04 3 views
0

У меня есть большой набор данных из 51 класса (51 папок/каталогов), каждый класс имеет 10 разных экземпляров (10 подкаталогов на каталог), и каждый экземпляр имеет 600 просмотров (600 файлов по 10 МБ каждый в подкаталог).Многопоточный подход для больших наборов данных

Я использую зазубренный массив задач читать эти файлы параллельно т.е.

Task[][] threads = new Task[51][10]; 

Более использования этого можно найти здесь Jagged array of tasks - Concurrency Issues

Есть ли подход лучше, чем это, потому что она призывает к непредвиденным ошибкам?

Edit: проводок код из ссылочного ссылки в случае, если будет удален

Task[][] threads = new Task[InstancesDir.Length][]; 
for (int i = 0; i < InstancesDir.Length; i++) 
{ 
    threads[i] = new Task[InstancesDir[i].Length]; 
} 
for (int i = 0; i < FilesDir.Length; i++) 
     { 
      for (int j = 0; j < FilesDir[i].Length; j++) 
      { 

       threads[i][j] = Task.Run(() => 
       { 
        Calculate(i, j, InstancesDir, FilesDir, PointSum); 
       }); 


      } 

      Task.WaitAll(threads[i]); 
     } 
+4

Это> 3TB данных ... чтение всего этого сразу в массив является довольно оптимистичным подходом: -D – Robert

+1

Диск ввода-вывода может стать узким местом. Память может быть проблемой. Лучше бы вам было просто читать куски, которые нужно обрабатывать, когда вам нужно их обрабатывать. –

+1

Не используйте несколько потоков. Параллельная обработка имеет смысл только в том случае, если сама обработка занимает много времени, и имеет смысл ее оптимизировать. Но я уверен, что большую часть времени вы будете читать данные (на самом деле обработка может занять менее 1% времени, действительно ли вы хотите ее оптимизировать?). Сделайте это в одном потоке (только один поток без UI), тогда у вас нет проблем с тем, как хранить и управлять потоками и т. Д. – Sinatr

ответ

0

Честно говоря, это вообще непонятно, как вы пришли на этот дизайн. Глядя на ссылочную запись (вы действительно должны включать все соответствующие подробности здесь ... что произойдет, если другая публикация будет переименована или удалена?), Похоже, что вы только когда-либо ждете по десять задач за раз. Так зачем же хранить все 510?

Подробнее, ваш диск работает только так быстро. Предполагая, что вы привязаны к вводу/выводу (т. Е. Вычисления, которые вы делаете с данными, не являются чрезвычайно дорогостоящими), в лучшем случае я ожидал бы, что два или три файла в большинстве обработанных одновременно будут полезны (выдача параллельных операций ввода-вывода может помочь дисковый уровень ввода-вывода планирует операции ввода-вывода на аппаратном обеспечении более эффективно).

Даже если ваши вычисления настолько дороги, что узким местом является процессор, это не поможет иметь больше параллельных операций, чем у вас есть ядра ЦП.

Отсутствие полезных деталей, которые бы точно объяснили, что вы здесь делаете, я бы сказал, что лучше всего забыть о том, как обрабатывать файлы одновременно. Делайте их последовательно и пропускайте все многопоточные ошибки.

Если вы знаете что-то о обработке, которая заставляет вас быть уверенным, что какой-то параллелизм важен, то вам нужно быть более конкретным в этом вопросе. Но даже там вы должны ограничить свой параллелизм; выходящие за рамки параллелизма, которые могут оказаться полезными, на самом деле могут быть вредными, так как все больше и больше потоков задерживаются на одном и том же узком месте, что приводит к дорогостоящим издержкам, таким как переключение контекста потока и перегрузка шины ввода-вывода.

+0

Ограничение до 4 потоков фактически улучшило производительность по сравнению с одним потоком. –

Смежные вопросы