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

grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql 

这是一个相当强大的Linux服务器上运行了一个小时,否则不会超载。 任何替代grep? 任何关于我的语法可以改进,(egrep,fgrep更好?)

该文件实际上是在一个目录中与另一台服务器的安装共享,但实际的磁盘空间是本地的,所以应该没有什么区别?

grep正在攫取高达93%的CPU

这里有几个选项:

1)用LC_ALL=C前缀grep命令,使用C语言环境而不是UTF-8。

2)使用fgrep因为你正在寻找一个固定的string,而不是一个正则expression式。

3)删除-i选项,如果你不需要它。

所以你的命令变成:

 LC_ALL=C fgrep -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql 

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

如果你有一个多核CPU,我真的推荐GNU并行 。 以并行方式grep一个大文件使用:

 < eightygigsfile.sql parallel --pipe grep -i -C 5 'db_pd.Clients' 

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

 < eightygigsfile.sql parallel --pipe --block 10M grep -i -C 5 'db_pd.Clients' 

这个问题并不完全清楚,但grep其他选项包括:

  • 删除-i标志。
  • 使用固定string的-F标志
  • 使用LANG=C禁用NLS
  • 使用-m标志设置最大匹配数。

一些微不足道的改进:

  • 删除-i选项,如果可以的话,不区分大小写非常慢。

  • 更换.\.

    单点是匹配任何字符的正则expression符号,这也是缓慢的

两条攻击线:

  • 你确定,你需要-i ,还是你有可能摆脱它?
  • 你有更多的核心玩吗? grep是单线程的,所以你可能希望以不同的偏移量启动更多的。