以任何方式刷新一个巨大的文件(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是单线程的,所以你可能希望以不同的偏移量启动更多的。