我有大量的小文件要搜索.我一直在寻找一个好的事实上的多线程版本的grep,但找不到任何东西.如何提高我对grep的使用?到目前为止,我正在这样做:

grep -R "string" >> Strings

推荐答案

如果您在多核处理器上安装了xargs,您可以从以下几点中受益,以防有人感兴趣.

Environment:

Processor: Dual Quad-core 2.4GHz
Memory: 32 GB
Number of files: 584450
Total Size: ~ 35 GB

Tests:

1. Find the necessary files, pipe them to xargs and tell it to execute 8 instances.

time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P8 grep -H "string" >> Strings_find8

real    3m24.358s
user    1m27.654s
sys     9m40.316s

2. Find the necessary files, pipe them to xargs and tell it to execute 4 instances.

time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P4 grep -H "string" >> Strings

real    16m3.051s
user    0m56.012s
sys     8m42.540s

3. Suggested by @Stephen: Find the necessary files and use + instead of xargs

time find ./ -name "*.ext" -exec grep -H "string" {} \+ >> Strings

real    53m45.438s
user    0m5.829s
sys     0m40.778s

4. Regular recursive grep.

grep -R "string" >> Strings

real    235m12.823s
user    38m57.763s
sys     38m8.301s

就我而言,第一个命令运行得很好.

Linux相关问答推荐

获取Perl文件::Tail开始在最后流传输文件

如何将netcdf文件列表中的特定变量添加到不同的文件中?

需要获取文件名、行号、模式在文件中的匹配位置

在 Rust 中重命名主线程

如何摆脱管道分隔字段中不需要的管道符号 - Linux

如何在不进行轮询且不吃掉其他人子进程的退出代码的情况下等待一组子进程(并且只有它们)?

可以用openmp并行化内存分配删除吗? (c++)

如何删除文件中不需要的字符(使用 shell 脚本)

如何在linux中将2个不同大小的图像(边框,实际图像)合并为1个

Dockerfile:无法复制文件

Linux 进程在后台 - 在作业(job)中 Stopped停止?

具体来说,fork() 如何处理 Linux 中 malloc() 动态分配的内存?

linux远程执行命令

如何在 Linux 中命名线程?

`是什么意思! -d` 在这个 Bash 命令中?

使用 C++ 和 Linux 的高分辨率计时器?

Linux 上真的没有异步块 I/O 吗?

如何自动启动 Solr?

如何使用cp从不同目录复制多个文件?

Linux 上的 OpenVPN:在命令行中传递用户名和密码