![shell脚本并行读取多个文件](https://linux22.com/image/25147/shell%E8%84%9A%E6%9C%AC%E5%B9%B6%E8%A1%8C%E8%AF%BB%E5%8F%96%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6.png)
我需要编写一个并行运行并在多个文件中查找字符串的脚本。
我尝试了很多选项,但它们降低了我的处理器的速度。
答案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 将按顺序运行得更快,这是正确的。