Grep'i hızlandırmak için bir indeks kullanmak?


9

Kendimi aynı kod tabanını tekrar tekrar okurken buluyorum. Harika çalışıyor olsa da, her komut yaklaşık 10 saniye sürer, bu yüzden daha hızlı yapmanın yollarını düşünüyorum.

Yapabilir grep bir çeşit indeks kullanıyor musunuz? Bir endeksin muhtemelen karmaşık regexps'lere yardımcı olmayacağını biliyorum, ancak çoğunlukla çok basit bildiri kullanıyorum. Bu vaka için bir indeksleyici var mı?

EDIT: Ben ctags ve benzeri hakkında biliyorum, ancak tam metin araması yapmak istiyorum.


Grep için özyinelemeli bir seçenek mi kullanıyorsunuz, yoksa bazı bulma / xargs gibi
Michał Šrajer

@ Michał: evet, -R
Peltier

Yanıtlar:


3

ne dersin cscope , bu ayakkabılarınla ​​aynı mı?

Şunun için arama koduna izin verir:

  • sembole yapılan tüm referanslar
  • küresel tanımlar
  • işlev tarafından çağrılan işlevler
  • Bir işlevi çağıran işlevler
  • Metin dizesi
  • düzenli ifade deseni
  • bir dosya
  • dosya içeren dosyalar

Aradığım şey bu olabilir, bir göz atacağım. Teşekkürler!
Peltier

Sadece C, belki C ++ ve Java için iyi çalışıyor gibi görünüyor
neves

4

Tam metin indeksleme

Gibi araçlar var recoll , homoseksüel-e ve sfenks ancak ihtiyacınız olan arama kriterlerini destekleyip desteklemediklerini kontrol etmeniz gerekir.

Recoll

Recoll, Unix / Linux için kişisel bir tam metin arama aracıdır.

Swish-e

Swish-e, Web sayfalarının veya diğer dosyaların koleksiyonlarını endekslemek için hızlı, esnek ve ücretsiz bir açık kaynak sistemidir.

sfenks

Sfenks toplu dizini ve bir SQL veritabanında, NoSQL deposunda veya sadece dosyaları hızlı ve kolay bir şekilde depolanan verileri aramanıza olanak sağlar

grep

Grep'in tarif ettiğiniz kadar yavaş olmasına şaşırdım, aranan dosyaların sayısını azaltabilir misiniz? Örneğin, kaynak dosyaları yalnızca bir çalıştırılabilir dosya için aramam gerektiğinde (bir projedeki çoğu dışında) grep adlarını o programın kaynak dosyalarını listeleyen bir komuttan beslerim:

grep expression `sources myprogram`

sources benim gelişim ortamıma özel bir program ama eşdeğer bir şey yapmış olabilirsiniz (veya inşa edebilirsiniz).

Sanırım ki gibi bariz teknikleri denedi

find /foo/myproject -name "*.c" -exec fgrep -l searchtext

Okudum öneri bu -P mevcut seçenek grep önemli ölçüde aramaları hızlandırabilir.


1
AFAIK konumlandırması sadece dosya isimleri içindir. Recoll işe yarardı, ama ben bir komut satırı aracını tercih ederdim. Kod tabanı oldukça büyük ve bir dize aradığım için nerede olduğunu bilmiyorum, bu yüzden aranacak dosya sayısını sınırlamak zor :)
Peltier

Ben swish-e komut satırı olduğunu düşünüyorum. Hiç denemedim (grep projelerimde yeterince hızlı)
RedGrittyBrick

2

grep, hayır. Ancak, dizinleri kullanan ve kod tabanına yönelik çeşitli programlar vardır. ctags (vim ile sağlanan bir versiyon var), etags (emacs ile kullanım amaçlı), global (editörden daha bağımsız) şu an düşündüğüm şey ancak muhtemelen başkaları da var.


Etiketleri kullanıyorum, ancak işlev isimlerinin aranması ile sınırlı değil mi? Tam metin araması yapmak istiyorum.
Peltier

Ctag'ın sınıf tanımını arayabildiğinden ve ISTR'nin de bir miktar kullanım bulabildiğinden eminim. Global'in ikisini de yaptığına eminim. Ancak bu araçların tam metin araması yapmadığı ve kapsamlarını sınırlamak için dil bilgisini kullandıkları doğrudur.
AProgrammer

2

bir tam metin arama motoru kullanmak istiyorsanız .. bir tane kullanın:


Bu her zaman bir seçenek, ancak daha hafif, hızlı ve kirli bir grep hızlandırması seçeneğinin olup olmadığını merak ediyordum.
Peltier

'daha hafif' ama 'eşyalarımı endeksli yapmak istiyorum' 2 aşırı uçtan biraz :) :) ctags istediğin şey için en uygun, kirli bir şey yapmak istiyorsan gerçek bir fulltext-search-engine kullanarak elde ettiğiniz her şeyle. örneğin, @RedGrittyBrick cevabında bahsedilen 'recoll' arka uç olarak xapian kullanıyor.
akira

1
Mutlaka uyumsuz değiller. Örneğin, etiketlerin bir --full-text seçeneğine sahip olup olmadığını düşünün ve bir --tag-file seçeneğini grepleyin. Elbette var olabileceği gerçeği, demek olduğu anlamına gelmez :)
Peltier

1

Kod tabanınızı bir RAM diskine kopyalayabilirsiniz.


-1

Hayır, sanmıyorum. Ancak basit bir çözüm olabilir: Haşlanmayı deneyin. Bence bir şans verirseniz, grep'ten önemli ölçüde daha hızlı bulacaksınız, daha iyi arama sonuçları elde etmek için daha kısa arama dizileri gerektiriyor ve aynı komut düğmelerini kullanırken pek çok istenen özelliğe sahip. Onu daha hızlı yapan (endeksli olmasa da) bir şey, aramak istemediğiniz şeyleri daha fazla görmezden gelmesidir. Perl ile yazılmış ve Perl’nin normal ifadelerini kullanıyor (ve bu nedenle Mac ve Windows portları da var).

http://betterthangrep.com/


Ack oldukça havalı. Ama aynı mekanizmalara dayandığından, grep'ten daha hızlı olduğundan şüpheliyim.
Peltier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.