Обрабатывать файлы в каталогах и подкаталогах одновременно - PullRequest
0 голосов
/ 23 октября 2018

У меня есть функция, которая проверяет, содержит ли файл в каталоге некоторую строку

boolean processFiles(File file, String phrase) {
      if (file.isFile()) {
        return fileContains(file, phrase);
      }

      try (DirectoryStream<Path> stream = Files.newDirectoryStream(file.toPath())) {
        for (Path entry: stream) {
          if (processFiles(entry.toFile(), phrase) {
            return true;
          }
        }
      }
      return false;
}

Как я могу использовать параллелизм для повышения производительности, если у меня много каталогов, подкаталогов и файлов?

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

Использование пула потоков фиксированного размера также проблематично в случае, еслиу нас есть много подкаталогов. Как лучше использовать потоки здесь для повышения производительности?

1 Ответ

0 голосов
/ 23 октября 2018

Использование пула потоков фиксированного размера также проблематично в случае, если у нас есть много подкаталогов

Это предположение , и это просто:неправильно.

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

Видите ли, вы не можете заставить произвольные проблемы идти быстрее , просто набрасывая на них (неограниченное) количество потоков.

Если вы серьезно относитесь к производительности, прекратите делать предположения.Вместо этого начните измерение.Проверьте, сколько времени требуется 1 потоку для «обработки» большего дерева.Делайте это неоднократно (скорее всего, кеширование файловой системы сыграет здесь большую роль).Затем посмотрите, что изменится, если вы используете фиксированный пул потоков.

Мое предположение : вы увидите некоторое ускорение, но довольно быстро, добавление большего количества потоков снова замедлит процесс.Угадайте здесь: пул с 4, максимум 8 потоками может дать вам «оптимальные» результаты.

В случае реализации вы можете поместить «новые» подкаталоги, требующие сканирования, в очередь, а затем ваши рабочие потоки получат их оточередь на обработку.

...