shell脚本并行读取多个文件

shell脚本并行读取多个文件

我需要编写一个并行运行并在多个文件中查找字符串的脚本。
我尝试了很多选项,但它们降低了我的处理器的速度。

答案1

如果文件位于不同的磁盘上,请grep在每个磁盘上运行一个命令。

对于同一磁盘上的文件,瓶颈在于从磁盘读取。并行读取多个文件只会使速度变差。

如果文件位于 RAID-0 阵列上,您可以通过grep同时运行两个命令来提高速度。进行基准测试,看看您是否真的赢得了时间。低技术含量的方法:

grep file1 file2 file3 &
grep file4 file5 file6

GNU并行:

parallel -j 2 grep ::: file1 file2 file3 file4 file5 file6

如果您从以下位置获取文件find

find … -print0 | parallel -0 -j 2

请记住:如果文件位于同一磁盘上,则单个grep命令是最快的。

答案2

我猜测您的文件非常大(否则您可能不会关心并行化作业)。

GNUparallel的建议很好(GNUxargs也有-P并行执行的选项)鉴于 grep 一个或多个文件是 I/O 密集型操作,而不是 CPU 密集型操作,您可能会发现并行运行多个 grep 实际上会减慢速度,因为现在有多个进程竞争磁盘访问。

I/O 速度是这里的限制因素,而不是 CPU 能力。即使是单个 grep 进程也可能花费大部分时间等待磁盘中的数据(即 CPU 大部分时间处于空闲状态)。

如果磁盘上的文件在物理上彼此不接近,则可能是许多速度变慢,因为磁盘头必须移动更多(当然,这在 SSD 或 ramdisk 上或者如果文件已经缓存的话不会是问题)

答案3

你可以尝试 GNU 并行:

find . -type f | parallel -k -j150% -n 1000 -m grep -H -n STRING {}

( 从http://www.gnu.org/software/parallel/man.html#example__parallel_grep

编辑:请注意,其他评论指出,如果瓶颈是 IO,grep 将按顺序运行得更快,这是正确的。

相关内容