На самом деле есть причина, по которой вы читаете лекции: это правильный ответ на вашу проблему. Вот предыстория, так что, возможно, вы сможете внести некоторые изменения в вашу живую среду.
Первое: каталоги хранятся в файловой системе; думать о них как о файлах, потому что это именно то, что они есть. Когда вы перебираете каталог, вы должны прочитать эти блоки с диска. Каждой записи каталога потребуется достаточно места для хранения имени файла, разрешений и информации о том, где этот файл находится на диске.
Второе: каталоги не хранятся с каким-либо внутренним порядком (по крайней мере, не в файловых системах, где я работал с файлами каталогов). Если у вас есть 150 000 записей и 2 подкаталога, эти 2 ссылки на подкаталоги могут быть где угодно в пределах 150 000. Вы должны выполнить итерацию, чтобы найти их, и тут нет пути.
Итак, допустим, что вы не можете избежать большого каталога. Ваша единственная реальная возможность - попытаться сохранить блоки, составляющие файл каталога, в кеше в памяти, чтобы вы не обращались к диску при каждом обращении к ним. Вы можете добиться этого, регулярно перебирая каталог в фоновом потоке - но это приведет к чрезмерной нагрузке на ваши диски и помешает другим процессам. Кроме того, вы можете отсканировать один раз и отслеживать результаты.
Альтернативой является создание многоуровневой структуры каталогов. Если вы посмотрите на коммерческие веб-сайты, вы увидите URL-адреса, такие как /1/150/15023.html - это означает, что количество файлов в каталоге будет небольшим. Думайте об этом как об индексе BTree в базе данных.
Конечно, вы можете скрыть эту структуру: вы можете создать слой абстракции файловой системы, который принимает имена файлов и автоматически генерирует дерево каталогов, в котором можно найти эти имена.