Перейти к содержанию

Параллельный обход

Холодный скан ускоряется за счёт одновременного обхода папок верхнего уровня.

Как устроено

  1. Корень читается один раз; файлы и агрегаты добавляются как обычно.
  2. Каждая папка верхнего уровня сканируется отдельным DiskScanner в DispatchQueue.concurrentPerform.
  3. Дочерние поддеревья детерминированно сливаются в общий TreeBuilder: сначала корни папок, затем их потомки. Это сохраняет непрерывные диапазоны childrenStart/childrenCount.
  4. Hard links учитываются через общий HardLinkRegistry с блокировкой. Канонический путь для ссылок из разных папок выбирается детерминированно, чтобы повторные сканы давали одинаковые суммы.
  5. Отмена и ошибки дочерних сканов обрабатываются как обычно; упавшая папка попадает в skipped.

Верхний уровень — единственный параллельный: вложенные папки внутри каждого поддерева обходятся последовательно. Это ограничивает число одновременных файловых дескрипторов и не создаёт лавину задач.

Настройка

Настройки → Сканирование → Параллельный обход каталогов.

По умолчанию включён. Отключите для диагностики, на медленном/сетевом диске или если нужен строго последовательный порядок.

Кэш

Флаг параллельности входит в метаданные кэша: смена настройки инвалидирует кэш и запускает полный скан. Подробнее — Кэш дерева.

Ограничения

  • Параллелизм только на верхнем уровне; глубокие деревья ускоряются меньше.
  • Порядок папок в дереве может отличаться от порядка чтения каталога, но суммы и наборы совпадают.
  • Прогресс в момент параллельного обхода обновляется после слияния поддеревьев.
  • Сетевые тома и внешние диски могут выигрывать меньше из-за latency.