インデックスを使用してgrepを高速化しますか?


10

私は何度も何度も同じコードベースを作り直していることに気づきました。うまくいくのですが、各コマンドは10秒ほどかかるので、もっと速くする方法を考えています。

ではgrep、ある種のインデックスを使用できますか?インデックスはおそらく複雑な正規表現には役に立たないと理解していますが、ほとんどの場合非常に単純なパターンを使用しています。この場合、インデクサーは存在しますか?

編集:ctagsなどについて知っていますが、フルテキスト検索を実行したいと思います。


あなたは方法のようなgrepまたはいくつかのfind / xargsに再帰的操作を使用していますか?
のMichałŠrajer

@Michał:はい、-R
ペルチェ

回答:


4

cscopeはどうですか、これはあなたの靴に合いますか?

次のコードを検索できます:

  • シンボルへのすべての参照
  • グローバル定義
  • 関数によって呼び出される関数
  • 関数を呼び出す関数
  • テキスト文字列
  • 正規表現パターン
  • ファイル
  • ファイルを含むファイル

それは私が探しているものかもしれません、私は見てみましょう。ありがとう!
ペルチェ

C、おそらくC ++とJavaでうまく機能するようです
2017

4

全文索引

recollswish -esphinxなどのツールがありますが、必要な検索基準をサポートできるかどうかを確認する必要があります。

リコール

Recollは、Unix / Linux用の個人用全文検索ツールです。

Swish-e

Swish-eは、Webページやその他のファイルのコレクションのインデックスを作成するための、高速で柔軟な無料のオープンソースシステムです。

スフィンクス

Sphinxを使用すると、SQLデータベース、NoSQLストレージ、またはファイルのみに保存されたデータをバッチ処理して迅速かつ簡単に検索できます

グレップ

grepがあなたの説明と同じくらい遅いのに驚いていますが、検索するファイルの数を減らすことはできますか?たとえば、(プロジェクト内の多くの)実行可能ファイルのソースファイルを検索するだけでよい場合、そのプログラムのソースファイルを一覧表示するコマンドからgrepに名前をフィードします。

grep expression `sources myprogram`

sources 私の開発環境に固有のプログラムですが、同等のものがある(または構築できる)場合があります。

私はあなたが次のような明白なテクニックを試したことを想定しています

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

現在のオプションを使用すると、検索を大幅に高速化できるという提案を読みました。-Pgrep


1
AFAIKロケートはファイル名専用です。recollは機能しますが、コマンドラインツールを使用します。コードベースはかなり大きく、文字列を探しているのでどこにあるのかわからないので、検索するファイルの数を制限するのは難しい:)
Peltier

swish-eはコマンドラインだと思います。私は何も試していません(grepは自分のプロジェクトで十分に高速です)
RedGrittyBrick

3

grep、いいえ。しかし、インデックスを使用し、コードベースを目的としたプログラムがいくつかあります。ctags(vimで提供されるバージョンがありetagsます)、global(emacsでの使用を目的としています)、(エディターからより独立している)は私が今考えているものですが、おそらく他にもあります。


ctagsを使用していますが、関数名の検索に限定されていませんか?全文検索をしたい。
ペルティエ

ctagもクラス定義を検索でき、ISTRもいくつかの用途を見つけることができると確信しています。グローバルは両方を行うと確信しています。しかし、これらのツールは全文検索を行わず、言語知識を使用してスコープを制限しているのは事実です。
AProgrammer 2011

3

コードベースをRAMディスクにコピーできます。


2

全文検索エンジンを使用する場合は、次のいずれかを使用します。


それは常にオプションですが、より軽量で迅速でダーティなgrep高速化オプションが存在するかどうか疑問に思っていました。
ペルチェ

「より軽量」ですが、「私のものを完全にインデックス化したい」というのは2つの極端な例です:)汚いことをすばやくしたい場合は、ctagsが最適です。それ以外はすべて、実際の全文検索エンジンを使用することになります。たとえば、@ RedGrittyBrickの回答で言及されている「recoll」は、バックエンドとしてxapianを使用しています。
akira

1
それらは必ずしも互換性があるわけではありません。たとえば、ctagsに--full-textオプションがあり、grepに--tag-fileオプションがあるとします。もちろん、それが存在する可能性があるという事実は、それが存在することを意味するわけではありません:)
ペルティエ

-1

いいえ、そうは思いません。しかし、簡単な解決策があるかもしれません:ackを試してください。チャンスを与えれば、grepよりも大幅に速く、より良い検索結果を得るために短い検索文字列が必要であり、多くの望ましい機能を備えている一方で、ほとんど同じコマンドスイッチを使用していると思います。(インデックス付けされていませんが)高速化する1つのことは、検索したくないものの多くを無視することです。これはPerlで書かれており、Perlの正規表現を使用します(したがって、MacとWindowsのポートも備えています)。

http://betterthangrep.com/


Ackはかなりクールです。しかし、同じメカニズムに基づいているため、grepよりも高速であることは間違いありません。
ペルティエ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.