Производительность простого поиска файлов в Java - PullRequest
1 голос
/ 21 февраля 2012

Мы запустили веб-сервер, который должен обслуживать файлы из довольно большого каталога, поэтому поиск файла с помощью простого подстановочного поиска, например «abcd * jklp *», имеет серьезные проблемы с производительностью.

Есть ли способ (трюк или библиотека) для ускорения поиска файлов в Java? Если нет, существует ли простое решение для кэширования, такое, что каждый поиск выполняется только один раз, если приложение явно не очищает кэш?

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Когда ваше веб-приложение запускается (и каждые x минут после этого), кэшируйте каждый файл, который вы намереваетесь использовать в статической переменной.Когда пользователи ищут определенный файл, ищите ваш статический кеш, а не выполняйте поиск на реальном файловом сервере.

Кэширование все прекрасно работает, если все, что вы разрешаете, это поиск по имени файла.Вы можете хранить каждый путь к файлу в списке / массиве.Если список / массив уже отсортирован, вы можете использовать бинарный поиск для пользовательских поисковых запросов.Если есть подстановочные знаки, генерируйте правильное значение RegEx.

. Для полнотекстового поиска содержимого файла сохранение статически всего этого было бы невозможным.Сделайте что-нибудь ленивое, например, верните свои файлы в базу данных или купите поисковое устройство, например GSA http://www.google.com/enterprise/search/gsa.html

0 голосов
/ 21 февраля 2012

Это не похоже на проблему Java.Это больше похоже на алгоритмическую проблему.Из этой проблемы я понял, что у вас есть большое количество файлов в заданном каталоге, и вам нужна строка шаблона с подстановочными знаками, чтобы обработать файл, соответствующий этим критериям.По сути, это проблема соответствия строк, когда у вас много строк и вам нужно найти только те, которые соответствуют определенным критериям.Есть много опций, с помощью которых вы можете сделать это, однако я предложу подход Дерево суффиксов для этого сценария, так как это даст почти o (n) производительность при поиске файлов.

0 голосов
/ 21 февраля 2012

«Хитрость» в поиске - предоставить как можно больше информации для первоначального запроса. Если мой нужный файл называется BobAndAlice и моя строка ввода равна B*, то теоретически он будет медленнее, чем поиск, использующий Bo*. Кэширование работает путем построения таблицы поиска в стиле, подобном HashMap, ради этого обсуждения. По сути, каждый запрос после отправки будет проверен на соответствие вашему Query Map, и если он был выполнен, а для флага Cache Emptied установлено значение false, то вы попадете на Lookup Table, который будет всеми указателями, полученными из результаты выполненного запроса. Тем самым допускается fast поиск уже полученных данных. Вы можете столкнуться с проблемой, если будете хранить дубликаты файлов вместо указателя на файл. Тот же процесс будет действителен для фактической передачи файла пользователю.

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