【问题标题】:How can I use grep with all available cores?如何将 grep 与所有可用内核一起使用?
【发布时间】:2018-03-17 17:09:28
【问题描述】:

问题:我们知道要查找的字符串,但不知道要查找的文件。

例如..

假设我们有一个包含以下内容的文件。

废话废话
.... 重要提示:非常重要的提示 ...... 呸呸呸呸

我们不知道文件名(可能有多个文件具有相同的“重要提示”标签),我们希望找到所有包含“重要提示”的文件

 

一种解决方案:

 find /directory/to/search/ -exec grep "IMPORTANT NOTE" {} /dev/null \; 

我会用它来编写脚本,因为我可以捕获文件名并用它做一些事情。

另一种解决方案:

 grep -R "重要提示" /directory/to/search/* 

我会用它来手动查找文件..

据我了解,以上运行在一个进程上并使用一个内核。是否可以将其修改为将每个文件搜索作为单独的任务执行,以利用机器上的所有可用内核? (有点像forkbomb1) 我知道你可以使用&在后台执行命令,这个可以用吗?如果是这样,我如何确保父 shell 保留命令输出的句柄?

1) fork bomb - 轻松拒绝服务“攻击”

重要提示:这将完全锁定您的机器。 (在你不关心的虚拟机上试试)

fork 炸弹的语法:

 :(){ : | :& }; :

【问题讨论】:

  • 为什么要使用全核?
  • 我只是想看看是否可以通过使用所有处理能力使其运行得更快。
  • 在 2-3 次实例之后,它将成为内存绑定,并且可能更早的磁盘绑定,除非您有一个非常大的系统。
  • 叉子炸弹和你的问题有什么关系?这似乎很冗长,而不是问一个范围很广的事情。我们需要锁定详细信息(即,如果您正在搜索一个或多个文件)以便能够评估答案的正确性。

标签: linux bash optimization grep find


【解决方案1】:

你可以做类似的事情

grep -R "IMPORTANT NOTE" /directory/to/search/[a-m]* &
grep -R "IMPORTANT NOTE" /directory/to/search/[n-z]* &

请注意,这并不涵盖所有文件。

【讨论】:

    【解决方案2】:

    使用xargs -P 可让您控制并发运行的实例数量,并在其他实例死亡时启动新实例。

    find /directory/to/search/ -print0 \
    | xargs -P 8 grep -n 1 -e "IMPORTANT NOTE" /dev/null
    

    也就是说——一般来说,这将是 I/O 而不是 CPU-bound;您应该担心最大化磁盘带宽,而不是 CPU 内核。

    【讨论】:

      猜你喜欢
      • 2018-07-27
      • 2022-01-18
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多