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

时间:2012-12-17 11:12:44

标签: bash grep

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

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

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

grep占用了高达93%的CPU

5 个答案:

答案 0 :(得分:125)

以下是一些选项:

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

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

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

所以你的命令变为:

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

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

答案 1 :(得分:26)

如果您有多核CPU,我建议GNU parallel。要并行使用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标记。
  • -F标志用于固定字符串
  • 使用LANG=C
  • 禁用NLS
  • 使用-m标志设置最大匹配数。

答案 2 :(得分:10)

一些微不足道的改进:

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

  • .替换为\.

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

答案 3 :(得分:3)

两行攻击:

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

答案 4 :(得分:1)

< eightygigsfile.sql parallel -k -j120% -n10 -m grep -F -i -C 5 'db_pd.Clients'  

如果您需要搜索多个字符串,grep -f strings.txt可以节省大量时间。以上是我正在测试的内容的翻译。 -j和-n选项值似乎最适合我的用例。 -F grep也有很大的不同。