14

这个问题与 如何有效地使用 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 内核的服务器计算机上运行此搜索。我希望我能以某种方式使用所有的处理能力来更快地运行这个搜索。

4

4 回答 4

13

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

... | xargs -n16 ...
于 2013-10-30T22:08:29.303 回答
11

这不是一大堆文件(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
于 2013-10-30T22:35:07.837 回答
-1

一个目录中有 800 万个文件!但是,800 万乘以 2kb 等于 16GB,而您有 50GB 的 RAM。我正在考虑一个RAMdisk ...

于 2013-10-30T21:55:06.763 回答
-3

如果你有这么多内存,为什么不把它全部读入内存并使用正则表达式库来搜索呢?这是一个简单的 C 程序:

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