为什么将1250个字符串与90k模式匹配如此之慢?


12

我的字符串是文件路径,例如s/14/11/13/15/n7ce49B_235_25ed2d70.jpg;我的模式很简单,都喜欢n7ce49B_.+

我跑GNU grep 2.6.3的Debian 6.0.10戴尔DL360G7服务器(我说出来,只是给这台机器性能比较的意义上)与15K硬盘,而这个命令:time LC_ALL=C grep -E -f path_to_patterns_file path_to_strings_file只是无法完成-服务器交换太差。如果使用20k模式,则需要3个多小时。

在我看来,这是不合理的。

每个注释请求都有以下文件:文件路径 20k个模式

还可以使用以下方法测试和调整输入线和图案的数量:

xxd -p /dev/urandom | fold -sw 100 | head -n 1250 |
  grep -Ef <(xxd -p /dev/urandom | fold -sw 10 | head -n 20000)

3
您的标题有90k,说明中有20K样式
-RomanPerekhrest

2
好吧,90k是我的原始输入大小,这使我的机器交换变得如此困难,以至于我不得不杀死该grep。然后,我尝试将其拆分为20k个文件,但仍然可以正常工作...但是,您说对我的描述不一致。
skaurus

2
请说明在期间服务器是否被加了税(执行其他一些资源匮乏的任务)grep
agc

2
可以用复制xxd -p /dev/urandom | fold -sw 100 | head -n 1250 | grep -Ef <(xxd -p /dev/urandom | fold -sw 10 | head -n 20000)。看来是花时间在编译正则表达式和分配大量内存上。使用-F代替-E,它是瞬时的。
斯特凡Chazelas

2
对于事,而不是n7ce49B_.+等同于n7ce49B_.
斯特凡Chazelas

Answers:


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.