14

この質問は 、grepを効率的に使用する方法に関連していますか?

800 万から 1000 万の小さな (~2-3kb) プレーン テキスト ファイルを含むフォルダーで「文字列」を検索しようとしています。「文字列」を含むすべてのファイルを知る必要があります。

最初はこれを使っていました

grep "string"

それは超遅かった。

それから私は試しました

grep * "string" {} \; -print

リンクされた質問に基づいて、これを使用しました

 find . | xargs -0 -n1 -P8 grep -H "string"

次のエラーが表示されます。

xargs: argument line too long

このタスクを比較的迅速に達成する方法を知っている人はいますか?

この検索は、使用可能な RAM が 50GB を超え、CPU が 14 コアのサーバー マシンで実行します。どうにかして、その処理能力をすべて使って、この検索をより高速に実行できたらいいのにと思います。

4

4 に答える 4

13

-0代わりに引数 toxargsおよび up-nパラメータを削除する必要があります。

... | xargs -n16 ...
于 2013-10-30T22:08:29.303 に答える
11

それほど大きなファイルスタックではありませんが (107 ファイルに称賛 - 厄介な夢)、100k ファイル (全体で 400 MB) を作成しました

for i in {1..100000}; do head -c 10 /dev/urandom > dummy_$i; done

純粋な好奇心のためにいくつかのテストを行いました(私が検索していたキーワード10はランダムに選択されました):

> time find . | xargs -n1 -P8 grep -H "10"
real 0m22.626s
user 0m0.572s
sys  0m5.800s

> time find . | xargs -n8 -P8 grep -H "10"
real 0m3.195s
user 0m0.180s
sys  0m0.748s

> time grep "10" *
real 0m0.879s
user 0m0.512s
sys  0m0.328s

> time awk '/10/' *
real 0m1.123s
user 0m0.760s
sys  0m0.348s

> time sed -n '/10/p' *
real 0m1.531s
user 0m0.896s
sys  0m0.616s

> time perl -ne 'print if /10/' *
real 0m1.428s
user 0m1.004s
sys  0m0.408s

ところで。STDOUTへのパイプで出力を抑えても、実行時間に大きな違いはありません/dev/null。それほど強力ではないラップトップで Ubuntu 12.04 を使用しています ;) 私の CPU は Intel(R) Core(TM) i3-3110M CPU @ 2.40GHz です。

より多くの好奇心:

> time find . | xargs -n1 -P8 grep -H "10" 1>/dev/null

real 0m22.590s
user 0m0.616s
sys  0m5.876s

> time find . | xargs -n4 -P8 grep -H "10" 1>/dev/null

real m5.604s
user 0m0.196s
sys  0m1.488s

> time find . | xargs -n8 -P8 grep -H "10" 1>/dev/null

real 0m2.939s
user 0m0.140s
sys  0m0.784s

> time find . | xargs -n16 -P8 grep -H "10" 1>/dev/null

real 0m1.574s
user 0m0.108s
sys  0m0.428s

> time find . | xargs -n32 -P8 grep -H "10" 1>/dev/null

real 0m0.907s
user 0m0.084s
sys  0m0.264s

> time find . | xargs -n1024 -P8 grep -H "10" 1>/dev/null

real 0m0.245s
user 0m0.136s
sys  0m0.404s

> time find . | xargs -n100000 -P8 grep -H "10" 1>/dev/null

real 0m0.224s
user 0m0.100s
sys  0m0.520s
于 2013-10-30T22:35:07.837 に答える
-3

それほど多くの RAM がある場合は、すべてをメモリに読み込んで、正規表現ライブラリを使用して検索してみませんか? これは単純な C プログラムです。

    #include <fcntl.h>
    #include <regex.h>
    ...
于 2015-04-27T16:35:29.027 に答える