В рамках проекта beagrep (http://baohaojun.github.com/beagrep.html) развивается полезный для разработчиков больших проектов вариант утилиты grep, способный выполнить поиск по дереву исходных текстов размером 2 Гб всего за 2 секунды (аналогичный поиск утилитой grep занимает 5 минут). Подобная скорость достигается благодаря использованию предварительной индексации данных, при этом построение индекса занимает достаточно много времени (для кода платформы Android индекс создаётся около 8 минут).
При обновлении файлов после построения индекса, они автоматически переиндексируются в процессе запуска утилиты (индекс нужно построить один раз, в дальнейшем он будет обновляться автоматически). Утилита поддерживает штатные возможности grep, в том числе поиск с использованием регулярных выражений и подсветка результатов. Программа распространяется (https://github.com/baohaojun/beagrep) под лицензией MIT и написана на языке C# с использованием Mono. Для индексации используется движок DotLucene.URL: http://baohaojun.github.com/beagrep.html
Новость: http://www.opennet.me/opennews/art.shtml?num=35606
>способный выполнить поиск по дереву исходных текстов размером 2 Гб всего за 2 секундыНаписали бы на С - было бы 0.2 секунды.
Написали бы на asm - было бы 0.16666 секунды.
Писали бы сразу в машинных кодах ... Да нет хрень это. )))
"Real Programmers don't use IDEs, they write programs using cat > a.out"
IDE и 100MB кода?
поделитесь секретом успеха, как настраивать, какой функционал не использовать.
>поделитесь секретом успеха, как настраивать, какой функционал не использовать.Сказали же, cat > file << EOF . :)
Все что нужно - coreutils
> "Real Programmers don't use IDEs, they write programs using cat > a.out"за бесконечное время, да.
> за бесконечное время, да.Чего бы ради за бесконечное? Может еще и для любой программы? :)
В каком музее таких программистов выставляют? Хочу сходить посмотреть.
Написали бы на жаве, было бы быстрее, чем на асме
> Написали бы на жаве, было бы быстрее, чем на асмеА если жаву переписать на жаве - говорят что из-за бесконечного ускорения явы явой образуется сингулярность.
только ребятам на адронном коллайдере этого не рассказывайте. так, на всякий. :)
Пайтон на пайтоне, опроверг эту теорию.
Хотя стал быстрее СИ.
> Пайтон на пайтоне, опроверг эту теорию.Недопиленная версия просто. Урезанная. Вот и... :)
писали бы на асм... не написали бы ещё.
> писали бы на асм... не написали бы ещё.Лучше упорная работа над собой, чем штампование тяп-ляпок за пару минут.
> написали *БЫ*
> было *БЫ*.
>> написали *БЫ*
>> было *БЫ*Ну и как, ты уже вкатил многометровую моновскую какашку не сервера ради ... грепа? :)
>>> написали *БЫ*
>>> было *БЫ*
> Ну и как, ты уже вкатил многометровую моновскую какашку не сервера ради
> ... грепа? :)Ради rsyslogа фанаты юникс-ой-вея будут и openjdk вкатывать, делов-то.
Причем не только на серваки, но и на эмбеддовку.
Только не надо тро-ло-то.
У rsyslog-а нет зависимостей кроме libc, libthr и libz.А вот не поклонники unix-вея готовы жить с огромным комбайном-блобом с сомнительной надежностью и пользой от последнего.
> А вот не поклонники unix-вея готовы жить с огромным комбайном-блобом с сомнительной надежностью и пользой от последнего.KERNEL32.DLL?
У разработчиков на C обычно нет проблемы с размерами исходных кодов, эта проблема остра для програмистов на яве, дотнет, и т.п.
У сишников есть ctags, нам этой монохрени не надо :)
Вообще-то ctag не только для сишников.... но все равно плюсую - монохрени не надо!
Окай, парниша, жду твою "правильную" реализацию. Или не можешь?
> Окай, парниша, жду твою "правильную" реализацию. Или не можешь?вам бы только новым велосипедам аплодировать
cscope, например есть как навигатор/поисковик
> вам бы только новым велосипедам аплодироватьА что плохого в разнообразии? Быть может однажды вот так создадут что-то интересное и перспективное.
>> вам бы только новым велосипедам аплодировать
> А что плохого в разнообразии? Быть может однажды вот так создадут что-то
> интересное и перспективное.В данном случае - заведомо неинтересно и бесперспективно. Что несколько очевидно. И смысл тогда с этим париться?
Не было бы. C выигрывает при расчетах, а при ворочании данных разницы с JVM и .NET/Mono не будет. Просто JVM и .NET/Mono изначально легко маштабируемы.
масштабируемы
Вообще-то будет с хорошей вероятностью - C обычно провоцирует городить много менее сложные структуры данных.
> Не было бы. C выигрывает при расчетах, а при ворочании данных разницы
> с JVM и .NET/Mono не будет. Просто JVM и .NET/Mono изначально
> легко маштабируемы.давайте на эрланге напишем тогда МАПРЕДУСЕ!
> Написали бы на С - было бы 0.2 секунды.Кроме того, если libc на серваке уже есть, то вот ставить туда куче мегов дотнета ради вшивенького грепа - вот уж увольте! Дотнетчики - больные на голову люди.
>> Написали бы на С - было бы 0.2 секунды.
> Кроме того, если libc на серваке уже есть, то вот ставить туда
> куче мегов дотнета ради вшивенького грепа - вот уж увольте! Дотнетчики
> - больные на голову люди.
> вот уж увольте!ты уволен
Спасибо. Ставить на сервера ради грепа многометровый крап - удовольствие ниже среднего.
>> вот уж увольте!
>ты уволенУборщик ночной смены сидящий за столом директора? Да - доставил :)
find $PATH -type f | while read f
do
awk '{print FILENAME ":" NR ":", $0}' $f
done
-ctime и прочее по вкусу
568М ядрёнокода проиндексировало за 1:14 с гзипаньем, "индекс" занял 184М,нахолодную:
time zgrep emu10k ~/kernel.gz 8,00s user 0,59s system 112% cpu 7,661 total
нагорячую (сопсна, можно индексировать в tmpfs)
time zgrep emu10k ~/kernel.gz > /dev/null 1,49s user 0,09s system 120% cpu 1,312 total
Хм, сделать что-то подобное мелким скриптом было бы забавно :-) А то для таких задач дотнеты - вроде и перебор...
> Хм, сделать что-то подобное мелким скриптом было бы забавно :-) А то
> для таких задач дотнеты - вроде и перебор...дык, в чём проблема, берите-пользуйтесь, в юзерский кронтаб засунуть (можно дополнительно поставить условие, чтобы смотрел, изменился ли каталог, чтобы лишний раз не переиндексировать), решение рабочее
Ну, как минимум либо демона с fanotify добавлять надо, либо сохранение mtime для файлов/каталогов и соответствующий апдейт - должно быть быстро по идее. Иначе новые вхождения пропускать будет. Но решение с индексацией по файлам и потом грепанием только избранных, как у автора, вроде забавнее... А дальше варианты - либо идексатор бе beagle а что-то попроще, но готовое, либо велосипед - там один хрен на 1000 строк кода...
> Ну, как минимум либо демона с fanotify добавлять надо, либо сохранение mtime
> для файлов/каталогов и соответствующий апдейт - должно быть быстро по идее.
> Иначе новые вхождения пропускать будет.это понятно, но во времена i7 и скоростных sata-шных винтов никто не мешает просто дергать переиндексацию каждый раз, если каталог изменился.
ваш скрипт не переиндексирует файл в случае модификации. Также проблемы с созданием новых файлов и удалением. Или предлагаете запускать скрипт вручную каждый раз?
с этим небольшие проблемы, но я уже писал пор ctime, можно добавлять в файл таймстэмпы, например, правда чуть усложнится грепанье. Да и переиндексировать всё не проблема - можно настроить в кронтабе, раз в n минут, например, нагрузка на IO и проц(особенно если ядер больше одного, gzip ведь не параллелится) чуть более чем никакая.В любом случае, лично мне трехстрочный скрипт, написанный на коленке за минуту симпатичнее, чем моноподелие, тянущее сотни мегабайт рантайма. Неынтырпрайзно? да и пофиг!
> с этим небольшие проблемы, но я уже писал пор ctime, можно добавлять
> в файл таймстэмпы, например, правда чуть усложнится грепанье. Да и переиндексировать
> всё не проблема - можно настроить в кронтабе, раз в n
> минут, например, нагрузка на IO и проц(особенно если ядер больше одного,
> gzip ведь не параллелится) чуть более чем никакая.Вот напишите, сделайте как у них, а мы посмотрим кто умнее. Просто сейчас вы взяли какой-то частный случай, героически его решили, и рассказываете что .net не нужен.
Авторы тоже взяли для примера частный случай андроидокода (в котором код ядра присутствует).Опять же, меня мой велосипед более чем устраивает.
А .net/mono нужен и пусть будет, но не для подобных задач.
Ага, щас. Буду mono ради grep'а ставить.
> написана на языке C# с использованием MonoСпасибо, не нужно. Штука полезная, но ставить ради неё сотню мб добра — увольте.
Это они ещё индексируемый cat на моно не выпустили!
Зато у них уже есть [почти] шелл на си-шарпе.
> Зато у них уже есть [почти] шелл на си-шарпе.Это который? Powershell, в котором автодополнение до сих пор нормально не работает, а консоль по прежнему взята из досбокса NT4? :)
Нет, просто интерактивная консоль шарпа. Автодополнение в рамках BCL. Запускаешь, пишешь код, оно сразу результаты выдаёт. Используется, как правило, для быстрой проверки работоспособности конструкций, ну или ради сложных трансформаций над данными с применением LINQ, если IDE запускать лениво или займёт больше времени.
Всё проще - там очень простая идея - оно основано на том, что часто грепается по чему-то, в чем можно выделить отдельные слова. Собственно, оно их выделяет, потом дергает поисковый движок (а именно Beagle - отсюда и нужда в Mono) и грепает только по файлав, которые вернул Бигль. Очень здравый подход, только это надо выполнять в виде скрипта, к которому поисковые движки вязались бы простейшим конфигом.
> грепает только по файлав, которые вернул Бигль. Очень здравый подход,ппц! Нет! - _П_ _П_ _Ц_ - пусть _такой_ grep у вантузятников в их вантузах только и будет.
А в моих юниксах grep будет честно ходить по fs и лопатить что Я ему сказал и как Я ему сказал. Азъ!
>> грепает только по файлав, которые вернул Бигль. Очень здравый подход,
> ппц! Нет! - _П_ _П_ _Ц_ - пусть _такой_ grep у вантузятников
> в их вантузах только и будет.
> А в моих юниксах grep будет честно ходить по fs и лопатить
> что Я ему сказал и как Я ему сказал. Азъ!А еще в твоих юниксах скоро будет rsyslog, с ElasticSearch (индексация логов). Который на Java.
Хм, а чем это лучше Cross-Reference типа LXR или OpenGrok? Последний еще и за счет Exuberant Ctags умеет понимать конструкции языка и поддерживает язык запросов.
> дереву исходных текстов размером 2 Гб всего за 2 секунды (аналогичный
> поиск утилитой grep занимает 5 минут)См.
google://google grep 30 GB s
и
прочие MapReduce>. Подобная скорость достигается благодаря использованию
Заметьте что гига _биты_. Не знаю кто меряет код в битах..., кроме маркетологов.
> Заметьте что гига _биты_. Не знаю кто меряет код в битах..., кроме
> маркетологов.Неправильно перевели.
В оригинальной новости 2G.
> MIT и написана на языке C#Угу, я уже побежал вкатывать моно на все серваки...
> Угу, я уже побежал вкатывать моно на все серваки...Ты такой смешной, хотя мне тебя жаль... Выполнять поиск по дереву исходных текстов на серверах. Ай-ай-ай! Да еще и на всех сразу! Работа сложная, ты устаешь, видимо, поэтому и мозг атрофируется...
Ну дык автор rsyslog в следующей версии, чтобы догнать и перегнать поцтеринга, собирается запилить индексирование логов через elasticsearch, который на java. Тут хошь-нехошь, а придется на серваки ставить.
>> MIT и написана на языке C#
> Угу, я уже побежал вкатывать моно на все серваки...твой горе-локалхост теперь серваками зовётся?
Офак. "Проиндексировал ли ты свои ихсодники?"...
Они не осилили `git grep`?
> Они не осилили `git grep`?Это дотнетчики. Ща они еще свой SVN напишут. Зато, блин, на дотнете :)
>> Они не осилили `git grep`?
> Это дотнетчики. Ща они еще свой SVN напишут. Зато, блин, на дотнете
> :)ты так раскудахтался, будто за свою никчёмную жизнь что-то сложнее пяти команд в шелле написал
> ты так раскудахтался, будто за свою никчёмную жизнь что-то сложнее пяти команд
> в шелле написалБатхерт у дотнетчика? Значит день удался!
> Батхерт у дотнетчика? Значит день удался!+100500 :-)
А всё обязано лежать в гите? Ну и их подход (я его выше описал) действительно весьма здрав, гит в большинстве случаев будет много медленнее.
> А всё обязано лежать в гите?Именно исходники - ну, почти. Поскольку там еще и версионирование есть.
Во-первых есть и другие SCM. Во-вторых как лежали на сорсфорже тарболлы, так и лежат, никуда не делись. Без всякого гит. То же касается и всяко разных исходников для андроида под разные мобилы. Ну в-третьих - грепать много по чему можно, исходниками это ну никак не ограничивается.
> Во-первых есть и другие SCM.Есть. Просто они как правило менее удобны. Особенно для проектов где 2 гига хлама индексируется. И кстати он не требует никакого моно долбучего с его немеряной кучей либ.
> Во-вторых как лежали на сорсфорже тарболлы, так
> и лежат, никуда не делись. Без всякого гит.Ну и пусть себе лежат. Тем кто оперирует тарболами обычно нафиг не уперлась какая-то индексация сорсов. Ибо не разработчики.
> То же касается и всяко разных исходников для андроида под разные мобилы.
У нормальных людей давно уже vcs есть. А у кого нету - гм, ну, мазохизм, наверное, имеет право на жизнь. Хотя особо удачливые мазохисты и дарвинисты опровергают этот тезис, успешно самовыпилившись.
Поразвлекался тут...
Исходники к прошивке андоида от Асера какого-то. 4 гига.git add - 9 с копейками минут. git commit - еще 3 минуты.
git grep simcom - 1 минута 40 секунд.обычный grep - прервал через 10 минут, ни черта не выдало
ack - 1 минута 50 секунд.И ack, и git grep вывели не все вхождения - пропустили бинари и что-то относящееся к сборке.
вышеуказанный скрипт добавлял 11 минут. Поиск по файлу с помощью zgrep - 46 секунд, Вытащил, разумеется, всё.
> вышеуказанный скрипт добавлял 11 минут. Поиск по файлу с помощью zgrep -
> 46 секунд, Вытащил, разумеется, всё.А beagrep сколько?
Поленился ставить. Но по идее - доли секунды поиск (там один запрос к индексу), а сама индексация - черт его знает...
> Во-первых есть и другие SCM. Во-вторых как лежали на сорсфорже тарболлы, так
> и лежат, никуда не делись. Без всякого гит.Сие есть правда. Как пложили их туда в начале нулевых - так и лежат. Не удаляюся но ии не обновляются.
А реальная жизнь нынче на других площадках, и что характерно - чаще с GIT :)
Что-то надо обновлять, что-то - нет. Много и на сорсфорже живого. Но суть не в том. Если нужен релиз (а как правило он и нужен) - чаще всего это таки тарболлы, даже если доступен версионник - обычно нужны дополнительные телодвижения, чтобы актуальный релиз из него дёрнуть.
> Что-то надо обновлять, что-то - нет. Много и на сорсфорже живого. Но
> суть не в том. Если нужен релиз (а как правило он
> и нужен) - чаще всего это таки тарболлы, даже если доступен
> версионник - обычно нужны дополнительные телодвижения, чтобы актуальный релиз из него
> дёрнуть.Обычно к версионнику добавляют веб-морду, а там вытянуть снапшот по тегу в виде архива - никакой проблемы.