Linux 如何将grep与大量(数百万)文件一起使用,在几分钟内搜索字符串并获得结果

Linux 如何将grep与大量(数百万)文件一起使用,在几分钟内搜索字符串并获得结果,linux,unix,search,text,grep,Linux,Unix,Search,Text,Grep,这个问题与 我试图在一个包含800-1000万个小(~2-3kb)纯文本文件的文件夹中搜索“字符串”。我需要知道所有有“字符串”的文件 起初我用这个 grep "string" 太慢了 然后我试着 grep * "string" {} \; -print 基于链接问题,我使用了这个 find . | xargs -0 -n1 -P8 grep -H "string" 我得到这个错误: xargs: argument line too long 有人知道相对更快地完成这项任务的方法吗

这个问题与

我试图在一个包含800-1000万个小(~2-3kb)纯文本文件的文件夹中搜索“字符串”。我需要知道所有有“字符串”的文件

起初我用这个

grep "string"
太慢了

然后我试着

grep * "string" {} \; -print
基于链接问题,我使用了这个

 find . | xargs -0 -n1 -P8 grep -H "string"
我得到这个错误:

xargs: argument line too long
有人知道相对更快地完成这项任务的方法吗


我在一台有超过50GB可用RAM和14个CPU内核的服务器上运行此搜索。我希望我能以某种方式使用所有的处理能力来更快地运行此搜索。

一个目录中有800万个文件!然而,800万次2kb等于16GB,并且您有50GB的RAM。我正在考虑一个RAMdisk…

您应该删除
-0
参数到
xargs
和up
-n
参数:

... | xargs -n16 ...

它不是那么大的一堆文件(幸亏有10个)⁷ 文件-一个混乱的梦想),但我用

并做了一些纯粹好奇的测试(我搜索的关键词10是随机选择的):







顺便说一句,如果我用管道
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

如果您有那么多RAM,为什么不将其全部读入内存并使用正则表达式库进行搜索呢?这是一个简单的C程序:

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

您需要知道字符串在哪个文件中吗?或者知道字符串在目录中的一个或多个文件中就足够了吗?我需要知道找到字符串的所有文件名。是的,文件夹中的文件太多了。你能详细说明一下如何更快地搜索“字符串”吗?很遗憾,我还没有一个解决方案。。。我仍在努力理解问题的参数。你在用什么操作系统?您使用的是什么文件系统?您是否尝试过单独运行“find”命令并对其计时?时间发现wc-lOS:Ubuntu(最新版本)。在2秒内找到返回的结果+1谢谢!成功了。在接受此回答之前,我将等待一些其他响应。
-n64
-n128
可能是一个更现实的数字。
n
同时使用的进程数是多少?man xargs显示
[-n max args]
最大进程是-P标志:
[-P max procs]
> 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
> 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
    #include <fcntl.h>
    #include <regex.h>
    ...