【发布时间】:2012-12-04 11:32:59
【问题描述】:
grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
这已经在一个相当强大的 linux 服务器上运行了一个小时,否则不会超载。 grep的任何替代品?关于我的语法有什么可以改进的,(egrep,fgrep 更好?)
该文件实际上位于与挂载到另一台服务器共享的目录中,但实际的磁盘空间是本地的,所以应该没有任何区别?
grep 占用了高达 93% 的 CPU
【问题讨论】:
-
根据您的语言环境,
-i开关可能会减慢进程,请尝试不使用-i或使用LC_ALL=C grep ...。此外,如果您只是寻找固定字符串,请使用grep -F。 -
正如@dogbane 提到的那样,使用 LC_ALL=C 变量和 fgrep 可以加快您的搜索速度。我做了一些测试并且能够实现1400% 性能提升,并写了一篇详细的文章为什么这是在我的speed up grep 帖子中
-
我很好奇 - 80GB 大小的文件是什么?我想当文件变得那么大时,可能会有更好的存储策略(例如轮换日志文件,或按层次分类到不同的文件和文件夹中)。此外,如果更改仅发生在文件的某些位置(例如,在末尾),则只需存储前面部分中未更改的 grep 结果,而不是对原始文件进行 grep,而是对存储的结果文件进行 grep。
-
我选择了github.com/google/codesearch——索引和搜索都快如闪电(用 Go 编写)。
cindex .索引您当前的文件夹,然后csearch db_pd.Clients。 -
如果您的文件被索引或排序,这可以大大更快。根据定义,搜索每一行是 O(n),而可以通过将其一分为二来查找已排序的文件——此时你会在一秒钟内搜索你的 80gb(因此为什么一个 80gb 的索引数据库根本不需要时间对于一个简单的选择,而你的 grep 需要......好吧,只要它需要)。