以任何方式获取一个巨大的文件(80GB)来加速它?

zza*_*per 102 bash grep

 grep -i -A 5 -B 5 'db_pd.Clients'  eightygigsfile.sql
Run Code Online (Sandbox Code Playgroud)

这已经在相当强大的Linux服务器上运行了一个小时,否则不会超载.grep的替代方案?关于我的语法有什么可以改进的,(egrep,fgrep更好吗?)

该文件实际上位于与另一台服务器的挂载共享的目录中,但实际的磁盘空间是本地的,所以不应该有任何区别?

grep占用了高达93%的CPU

dog*_*ane 138

以下是一些选项:

1)在grep命令前加上LC_ALL=C使用C语言环境而不是UTF-8.

2)使用fgrep是因为您正在搜索固定字符串,而不是正则表达式.

3)-i如果您不需要,请删除该选项.

所以你的命令变成:

LC_ALL=C fgrep -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
Run Code Online (Sandbox Code Playgroud)

如果将文件复制到RAM磁盘,速度也会更快.

  • 有些人(不是我)喜欢`grep -F`比`fgrep`更多 (6认同)
  • 这要快得多一点.顺便说一下,我添加了-n来获取行号.也许在比赛结束后退出-m (4认同)
  • 哇非常感谢@dogbane很棒的小费!这导致我走下研究隧道找出[为什么LC_ALL = C加速grep](http://www.inmotionhosting.com/support/website/how-to/speed-up-grep-searches-with-lc-所有)这是一个非常有启发性的经历! (4认同)
  • 我的理解是`LANG = C`(而不是`LC_ALL = C`)就足够了,而且更容易输入. (2认同)
  • @Adrian`fgrep`是写`grep -F`的另一种方式,因为`man fgrep`会告诉你。某些版本的“ man”也表示前者不推荐使用后者,但较短的形式太方便了以至于无法使用。 (2认同)

Ste*_*eve 31

如果你有一个多核CPU,我真的建议GNU并行.要并行使用grep大文件:

< eightygigsfile.sql parallel --pipe grep -i -C 5 'db_pd.Clients'
Run Code Online (Sandbox Code Playgroud)

根据您的磁盘和CPU,读取较大的块可能会更快:

< eightygigsfile.sql parallel --pipe --block 10M grep -i -C 5 'db_pd.Clients'
Run Code Online (Sandbox Code Playgroud)

你的问题并不完全清楚,但其他选择grep包括:

  • 放下-i旗帜.
  • 使用-F固定字符串的标志
  • 禁用NLS LANG=C
  • 使用-m标志设置最大匹配数.

  • 如果是实际文件,请使用`--pipepart` 代替`--pipe`。它要快得多。 (2认同)

Ben*_*ela 10

一些微不足道的改进:

  • 删除-i选项,如果可以,不区分大小写很慢.

  • 更换.\.

    单点是匹配任何字符的正则表达式符号,这也很慢