Usi un indice per rendere grep più veloce?


10

Mi ritrovo a utilizzare sempre la stessa base di codice. Mentre funziona alla grande, ogni comando richiede circa 10 secondi, quindi sto pensando a come renderlo più veloce.

Quindi puoi grepusare una sorta di indice? Capisco che un indice probabilmente non aiuterà per regexps complicati, ma uso principalmente schemi molto semplici. Esiste un indicizzatore per questo caso?

EDIT: conosco ctags e simili, ma mi piacerebbe fare una ricerca full-text.


Stai usando un'ozione ricorsiva per grep o in qualche modo trova / xargs?
Michał Šrajer,

@ Michał: sì, -R
Peltier,

Risposte:


4

che dire di cscope , questo corrisponde alle tue scarpe?

Consente la ricerca del codice per:

  • tutti i riferimenti a un simbolo
  • definizioni globali
  • funzioni chiamate da una funzione
  • funzioni che chiamano una funzione
  • stringa di testo
  • modello di espressione regolare
  • un file
  • file incluso un file

Potrebbe essere quello che sto cercando, darò un'occhiata. Grazie!
Peltier,

Sembra che funzioni bene per C, forse C ++ e Java
neves

4

Indicizzazione full-text

Ci sono strumenti come richiamo , swish-e e sfinge ma dovresti controllare se possono supportare il tipo di criteri di ricerca di cui hai bisogno.

Recoll

Recoll è uno strumento di ricerca di testo completo personale per Unix / Linux.

Swish-e

Swish-e è un sistema open source veloce, flessibile e gratuito per l'indicizzazione di raccolte di pagine Web o altri file.

Sfinge

Sphinx consente di indicizzare in batch e cercare i dati archiviati in un database SQL, archiviazione NoSQL o semplicemente file in modo rapido e semplice

grep

Sono sorpreso che grep sia lento come descrivi, puoi ridurre il numero di file cercati? Ad esempio, quando ho solo bisogno di cercare i file di origine per un eseguibile (tra i tanti in un progetto), fornisco grep i nomi da un comando che elenca i file di origine per quel programma:

grep expression `sources myprogram`

sources è un programma specifico per il mio ambiente di sviluppo ma potresti avere (o essere in grado di costruire) qualcosa di equivalente.

Suppongo che tu abbia provato tecniche ovvie come

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

Ho letto un suggerimento che l' -Popzione di corrente greppuò velocizzare significativamente le ricerche.


1
AFAIK Locate è solo per i nomi di file. il richiamo funzionerebbe, ma preferirei uno strumento da riga di comando. La base di codice è piuttosto grande, e poiché sto cercando una stringa, non so dove sia, quindi è difficile limitare il numero di file da cercare :)
Peltier

Penso che swish-e sia la riga di comando. Non ne ho provato nessuno (grep è abbastanza veloce nei miei progetti)
RedGrittyBrick

3

grep, no. Ma ci sono diversi programmi che usano gli indici e mirano alla base di codice. ctags(esiste una versione fornita con vim), etags(destinato all'uso con emacs), global(più indipendente dall'editor) sono quello a cui sto pensando ora ma probabilmente ce ne sono altri.


Uso ctags, ma non è limitato alla ricerca dei nomi delle funzioni? Voglio fare una ricerca full-text.
Peltier,

Sono abbastanza sicuro che ctag possa anche cercare la definizione di classe e ISTR che trova anche un certo uso. Sono certo che globale fa entrambe le cose. Ma è vero che quegli strumenti non eseguono una ricerca full-text e utilizzano la conoscenza della lingua per limitarne l'ambito.
AProgrammer

3

È possibile copiare la base di codice su un disco RAM.


2

se vuoi usare un motore di ricerca full text .. usa uno:


È sempre un'opzione, ma mi chiedevo se esistesse un'opzione di speedup grep più leggera, veloce e sporca.
Peltier,

'più leggero' ma 'voglio avere le mie cose completamente indicizzate' sono un po 'di 2 estremi :) ctags è la migliore corrispondenza per quello che vuoi, se vuoi solo andare veloce e sporco. con tutto il resto si finisce per usare un vero motore di ricerca full-text. ad esempio, "recoll" menzionato nella risposta @RedGrittyBrick sta usando xapian come backend.
Akira,

1
Non sono necessariamente incompatibili. Immagina se ctags avesse un'opzione --full-text, per esempio, e grep un'opzione --tag-file. Naturalmente il fatto che possa esistere non significa che lo sia :)
Peltier,

-1

No, non la penso così. Ma potrebbe esserci una soluzione semplice: prova ack. Penso che se gli dai una possibilità, lo troverai significativamente più veloce di grep, richiede stringhe di ricerca più brevi per ottenere risultati di ricerca migliori e ha molte caratteristiche desiderabili, usando allo stesso modo le stesse opzioni di comando. Una cosa che lo rende più veloce (anche se non indicizzato) è che ignora molte più cose che non vuoi cercare. È scritto in Perl e usa le espressioni regolari di Perl (e quindi ha anche porte Mac e Windows).

http://betterthangrep.com/


Ack è piuttosto figo. Ma dubito davvero che sia più veloce di grep, poiché si basa sugli stessi meccanismi.
Peltier,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.