У меня есть большой набор данных из 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]);
}
Это> 3TB данных ... чтение всего этого сразу в массив является довольно оптимистичным подходом: -D – Robert
Диск ввода-вывода может стать узким местом. Память может быть проблемой. Лучше бы вам было просто читать куски, которые нужно обрабатывать, когда вам нужно их обрабатывать. –
Не используйте несколько потоков. Параллельная обработка имеет смысл только в том случае, если сама обработка занимает много времени, и имеет смысл ее оптимизировать. Но я уверен, что большую часть времени вы будете читать данные (на самом деле обработка может занять менее 1% времени, действительно ли вы хотите ее оптимизировать?). Сделайте это в одном потоке (только один поток без UI), тогда у вас нет проблем с тем, как хранить и управлять потоками и т. Д. – Sinatr