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