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