【问题标题】:What is the fastest possible egrep [duplicate]什么是最快的 egrep [重复]
【发布时间】:2014-06-20 01:38:38
【问题描述】:

我需要从一个包含 200 万行的大型 csv 文件中进行 egrep,我想将 egrep 时间减少到 0.5 秒,这可能吗?不,我现在不想要数据库(sqlite3 或 MySQL)..

$ time wc foo.csv
2000000 22805420 334452932 foo.csv
real 0m3.396s
user 0m3.261s
sys 0m0.115s

我已经能够将运行时间从 40 秒缩短到 1.75 秒

$ time egrep -i "storm|broadway|parkway center|chief financial" foo.csv|wc -l

108292

real    0m40.707s
user    0m40.137s
sys     0m0.309s

$ time LC_ALL=C egrep -i "storm|broadway|parkway center|chief financial" foo.csv|wc -l

108292

real    0m1.751s
user    0m1.590s
sys     0m0.140s

但我希望egrep实时小于半秒,任何技巧将不胜感激,文件不断变化,所以我不能使用任何缓存机制......

【问题讨论】:

  • grep 的运行速度可能比您的磁盘系统吐出数据的速度要快。如果您想要更快的结果,那么请使用更快的磁盘。
  • 马克,unix内核会缓存,不是磁盘问题
  • wc foo.csv 在您的系统上运行了多少时间?请加time wc foo.csv
  • “文件不断变化”。那么它就不会被缓存。
  • $ time wc foo.csv 2000000 22805420 334452932 foo.csv real 0m3.396s user 0m3.261s sys 0m0.115s

标签: linux bash shell awk grep


【解决方案1】:

如果您只是搜索关键字,可以使用fgrep(或grep -F)代替egrep

LC_ALL=C grep -F -i -e storm -e broadway -e "parkway center" -e "chief financial"

接下来要尝试的是分解-i,这可能是现在的瓶颈。例如,如果您确定只有第一个字母可能大写,您可以这样做:

LC_ALL=C grep -F \
   -e{S,s}torm -e{B,b}roadway -e{P,p}"arkway "{C,c}enter -e{C,c}"hief "{F,f}inancial

【讨论】:

  • rici,太棒了!我在 3 次尝试中将其平均缩短到 1 秒,再缩短 0.5 秒!
  • @Cindy:酷。好的,有另一个想法,但我不知道它会有多大的不同。编辑答案。
  • rici: -i 必须在那里
  • rici:无论如何,没有 -i,节省 0.1 秒
  • @CindyTurlington: 10% 是 10% :) 如果您不希望文件包含“paRKwaY ceNteR”,可能值得。除此之外,我认为您唯一的选择是并行性,但这很棘手,因为您无法先验地知道在哪里拆分文件。
猜你喜欢
  • 2018-04-29
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 2018-07-13
相关资源
最近更新 更多