Параллельный обход¶
Холодный скан ускоряется за счёт одновременного обхода папок верхнего уровня.
Как устроено¶
- Корень читается один раз; файлы и агрегаты добавляются как обычно.
- Каждая папка верхнего уровня сканируется отдельным
DiskScannerвDispatchQueue.concurrentPerform. - Дочерние поддеревья детерминированно сливаются в общий
TreeBuilder: сначала корни папок, затем их потомки. Это сохраняет непрерывные диапазоныchildrenStart/childrenCount. - Hard links учитываются через общий
HardLinkRegistryс блокировкой. Канонический путь для ссылок из разных папок выбирается детерминированно, чтобы повторные сканы давали одинаковые суммы. - Отмена и ошибки дочерних сканов обрабатываются как обычно; упавшая папка
попадает в
skipped.
Верхний уровень — единственный параллельный: вложенные папки внутри каждого поддерева обходятся последовательно. Это ограничивает число одновременных файловых дескрипторов и не создаёт лавину задач.
Настройка¶
Настройки → Сканирование → Параллельный обход каталогов.
По умолчанию включён. Отключите для диагностики, на медленном/сетевом диске или если нужен строго последовательный порядок.
Кэш¶
Флаг параллельности входит в метаданные кэша: смена настройки инвалидирует кэш и запускает полный скан. Подробнее — Кэш дерева.
Ограничения¶
- Параллелизм только на верхнем уровне; глубокие деревья ускоряются меньше.
- Порядок папок в дереве может отличаться от порядка чтения каталога, но суммы и наборы совпадают.
- Прогресс в момент параллельного обхода обновляется после слияния поддеревьев.
- Сетевые тома и внешние диски могут выигрывать меньше из-за latency.