Каков наиболее эффективный способ перечисления всех файлов в каталоге (включая подкаталоги)? - PullRequest
1 голос
/ 19 марта 2010

Я пишу сервлет, который проверяет каталог на сервере (внешний по отношению к веб-контейнеру) и рекурсивно ищет определенные файлы (по определенным файлам, я имею в виду файлы с определенным расширением, а также с определенным именем конвенции). Как только эти файлы найдены, сервлет отвечает длинным списком всех найденных файлов (включая полный путь к файлам). Моя проблема в том, что файлов и каталогов так много, что мой сервлет работает очень медленно. Мне было интересно, есть ли лучшая практика или существующий сервлет для этого типа проблемы? Будет ли эффективнее просто скомпилировать весь список файлов и выполнить фильтрацию через js / jquery на стороне клиента?

Ответы [ 4 ]

2 голосов
/ 19 марта 2010

Доступ к диску медленный, и с увеличением количества файлов и каталогов вы быстро достигнете точки, когда ваш сервлет станет бесполезным при использовании обычного рекурсивного поиска в дереве каталогов. Особенно быстро вы достигнете этого предела, если у вас большое количество одновременно работающих пользователей, выполняющих один и тот же поиск в одно и то же время.

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

find <path_to_directory> -name '*.bin' > list_files.txt

В этом списке будут перечислены все имена файлов, оканчивающиеся на .bin в определенном каталоге, и выведен его в файл с именем list_files.txt. Ваш сервлет может затем прочитать этот файл и создать список файлов оттуда.

1 голос
/ 19 марта 2010

Я вижу две возможные причины, по которым этот процесс может идти медленно:

1) Дисковый ввод / вывод занимает слишком много времени. Это будет реальным ограничением, с которым вы ничего не можете поделать. Обычно операционная система довольно хорошо хранит структуры в памяти, которые позволяют гораздо быстрее находить файлы в ваших папках. Если он слишком медленный, вам может потребоваться создать индекс самостоятельно. Все зависит от того, как вы это делаете.

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

2) Что-то не так с обходом каталога. Вы говорите, что это "рекурсивно". Если вы имеете в виду, что он на самом деле рекурсивный, то есть метод, который вызывает себя всякий раз, когда сталкивается с новым каталогом, то это может замедлить вас (накладные расходы действительно увеличиваются). В википедии есть кое-что о обходе дерева , но в основном просто используйте очередь или стек, чтобы отслеживать, где вы находитесь, вместо использования состояния вашего метода для этого.

Обратите внимание, что файловая система на самом деле не является деревом, но я предполагаю, что это в этом случае. В противном случае это немного раздражает.

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

1 голос
/ 19 марта 2010

Если у вас действительно много файлов, вы можете подумать о порождении внешнего процесса для поиска. Если вы работаете на Unix-подобном сервере (например, Linux), вы можете получить выигрыш в скорости, если команда «find» выполнит поиск и проанализирует ее вывод.

Вы можете найти множество примеров использования "find" в Google.

0 голосов
/ 19 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...