Task Parallel Library для обхода каталога - PullRequest
6 голосов
/ 11 ноября 2010

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

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

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

на

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

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

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

1 Ответ

15 голосов
/ 11 ноября 2010

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

Это немного похоже на попытку присоединить несколько шлангов к одному крану для более быстрого вытекания воды - или попытку запустить 16 потоковых процессоров на одном ядре

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...