Библиотека параллельных задач для обхода каталога

Я хотел бы просмотреть каталог на моем жестком диске и выполнить поиск по всем файлам для определенной строки поиска. Это звучит как идеальный кандидат на то, что можно (или нужно) делать параллельно, поскольку IO довольно медленный.

Традиционно, я бы написал рекурсивную функцию, чтобы найти и обработать все файлы в текущем каталоге, а затем вернуться во все каталоги в этом каталоге. Мне интересно, как я могу изменить это, чтобы быть более параллельным. Сначала я просто изменил:

foreach (string directory in directories) { ... }

в

Parallel.ForEach(directories, (directory) => { ... }) 

но я чувствую, что это может создать слишком много задач и привести себя в замешательство, особенно при попытке вернуться обратно в поток пользовательского интерфейса. Я также чувствую, что количество задач непредсказуемо и что это не может быть эффективным способом парализовать (это слово?) Эту задачу.

Кто-нибудь успешно делал что-то подобное раньше? Какой у вас совет при этом?

1 ответ

Решение

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

Это все равно, что пытаться подключить несколько шлангов к одному крану, чтобы быстрее вытекать воду, или пытаться запустить 16 потоковых процессоров на одном ядре:)

Другие вопросы по тегам