Возможно, вы захотите изучить инструментарий GNU idutils . На локальной копии исходных кодов ядра Linux он может выдать такой код:
$ gid ugly
include/linux/hil_mlc.h:66: * a positive return value causes the "ugly" branch to be taken.
include/linux/hil_mlc.h:101: int ugly; /* Node to jump to on timeout */
Восстановление индекса из холодного кэша достаточно быстро:
$ time mkid
real 1m33.022s
user 0m17.360s
sys 0m2.730s
Восстановление индекса из теплого кэша происходит намного быстрее:
$ time mkid
real 0m15.692s
user 0m15.070s
sys 0m0.520s
Индекс занимает только 46 мегабайт для моих 2,1 гигабайта данных - что крошечно по сравнению с вашими, но соотношение хорошее.
Нахождение 399 вхождений foo
заняло всего 0.039
секунд:
$ time gid foo > /dev/null
real 0m0.038s
user 0m0.030s
sys 0m0.000s
Обновление
Ларсману было интересно узнать производительность git grep
на исходных кодах ядра - это отличный способ показать, какой прирост производительности обеспечивает gid(1)
.
В холодном кэше git grep foo
(который вернул 1656 записей, гораздо больше, чем idutils):
$ time git grep foo > /dev/null
real 0m19.231s
user 0m1.480s
sys 0m0.680s
Как только кеш прогрелся, git grep foo
работает намного быстрее:
$ time git grep foo > /dev/null
real 0m0.264s
user 0m1.320s
sys 0m0.330s
Поскольку мой набор данных полностью помещается в ОЗУ, когда кэш нагревается, git grep
довольно удивительно: он всего в семь раз медленнее, чем утилита gid(1)
, и, безусловно, будет более чем достаточно быстр для интерактивного использования. Если рассматриваемый набор данных не может быть полностью кэширован (что, вероятно, именно там на самом деле все становится интересным), то выигрыш в производительности индекса очевиден.
Две жалобы на idutils:
Нет нумерации страниц. Это определенно недостаток, хотя, по моему опыту, он работает достаточно быстро, чтобы просто хранить результаты поиска в другом месте. Если поиск вернет значительный процент исходного набора данных, то хранение частичных результатов определенно будет раздражать.
Нет API: правда, API нет. Но источник доступен; src/lid.c
функция report_grep()
принимает связанный список файлов, которые соответствуют выводу. Немного возиться с этой функцией должно даже предложить нумерацию страниц. (Это займет некоторое время.) В конце концов, у вас будет C API, который все еще может быть не идеальным. Но его настройка не выглядит ужасно.
Однако слабым местом, которое, вероятно, является наихудшим, является отсутствие постепенного обновления базы данных. Если все файлы обновляются три раза в день, это не имеет большого значения. Если некоторые файлы обновляются три раза в день, это делает ненужную работу. Если несколько файлов обновляются три раза в день, должно быть лучшее решение.