簡體   English   中英

如何使用大(數百萬)個文件的grep來搜索字符串並在幾分鍾內得到結果

[英]How to use grep with large (millions) number of files to search for string and get result in few minutes

這個問題與如何有效地使用grep有關

我試圖在一個文件夾中搜索一個“字符串”,該文件夾有8-10萬個小(~2-3kb)純文本文件。 我需要知道所有具有“字符串”的文件。

起初我用過這個

grep "string"

那太慢了。

然后我試了一下

grep * "string" {} \; -print

根據相關問題,我使用了這個

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

我收到此錯誤:

xargs: argument line too long

有誰知道相對更快地完成這項任務的方法?

我在具有超過50GB可用RAM和14核CPU的服務器機器上運行此搜索。 我希望以某種方式我可以使用所有處理能力來更快地運行此搜索。

您應該刪除-0參數到xargs和up -n參數:

... | xargs -n16 ...

這不是那么大的文件堆棧(對10⁷文件的稱贊 - 一個混亂的夢想),但我創建了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

一個目錄中有800萬個文件! 但是,800萬2kb是16GB,你有50GB的RAM。 我在想一個RAMdisk ......

如果你有那么多RAM,為什么不把它全部讀入內存並使用正則表達式庫來搜索? 這是一個簡單的C程序:

    #include <fcntl.h>
    #include <regex.h>
    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM