golang 编译大量的正则怎么优化

woaiyou5 · 2017-11-15 05:07:17 · 2099 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-11-15 05:07:17 的主题,其中的信息可能已经有所发展或是发生改变。

现在有100个正则放在数组里做文件内容的匹配,现在的写法是在 遍历文件时(很多,几千个文件),每次匹配之前 都编译了一遍,导致运行的时候 cpu 容易暴增到100。 挺费性能的 。现在想法是 能不能先把这些正则 都使用regexp.Compile 编译好,每次匹配文件内容的时候 就不需要再匹配了,直接reg.Find就好了。 求指导。

下图中 是现在的渣渣代码, rule是一个有100个正则的数组。 111.jpg


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2099 次点击  
加入收藏 微博
13 回复  |  直到 2017-11-16 05:41:17
momaek
momaek · #1 · 7年之前

可以在程序启动的时候编译好

woaiyou5
woaiyou5 · #2 · 7年之前
momaekmomaek #1 回复

可以在程序启动的时候编译好

编译好里的话,怎么存到一个地方里,例如list 里面,我下次使用时,才好循环遍历出来呢。 这个怎么存呢 能写个代码事例么?

rock_zhang
rock_zhang · #3 · 7年之前

你可以我正则存在文件文本里面,每行文本一个正则,然后通过遍历文本进行匹配

woaiyou5
woaiyou5 · #4 · 7年之前

@rock_zhang 我的意思是 比方说我用100个正则,扫描1000个文件,那我就得编译1000*100次。 能不能就编译100次,然后多次匹配 这1000个文件

rock_zhang
rock_zhang · #5 · 7年之前

怎么会编译1000*100次, 你所有文件路径是一个list,然后通过遍历文本,去匹配正则,编译一次就好了

momaek
momaek · #6 · 7年之前
woaiyou5woaiyou5 #2 回复

#1楼 @momaek 编译好里的话,怎么存到一个地方里,例如list 里面,我下次使用时,才好循环遍历出来呢。 这个怎么存呢 能写个代码事例么?

可以存一个 []*regexp.Regexp 这个的数组,然后用的时候遍历这个数组

momaek
momaek · #7 · 7年之前
woaiyou5woaiyou5 #4 回复

@rock_zhang 我的意思是 比方说我用100个正则,扫描1000个文件,那我就得编译1000*100次。 能不能就编译100次,然后多次匹配 这1000个文件

简单来说就是

var (
  regexes []*regexp.Regexp
  strs []string
)
func init(){
 for _,v:=range strs{
  regexes = append(regexes, regexp.MustCompile(v))
 }
}
channel
channel · #8 · 7年之前
momaekmomaek #7 回复

#4楼 @woaiyou5 简单来说就是 ```golang var ( regexes []*regexp.Regexp strs []string ) func init(){ for _,v:=range strs{ regexes = append(regexes, regexp.MustCompile(v)) } } ```

同意

woaiyou5
woaiyou5 · #9 · 7年之前
momaekmomaek #6 回复

#2楼 @woaiyou5 可以存一个 []*regexp.Regexp 这个的数组,然后用的时候遍历这个数组

谢谢前辈指导,我马上去测试!

woaiyou5
woaiyou5 · #10 · 7年之前
rock_zhangrock_zhang #5 回复

怎么会编译1000*100次, 你所有文件路径是一个list,然后通过遍历文本,去匹配正则,编译一次就好了

因为不会写。。 所以现在就是编译了好多次, 下面大神给了 代码事例 我去测测~ 嘿嘿

woaiyou5
woaiyou5 · #11 · 7年之前
momaekmomaek #7 回复

#4楼 @woaiyou5 简单来说就是 ```golang var ( regexes []*regexp.Regexp strs []string ) func init(){ for _,v:=range strs{ regexes = append(regexes, regexp.MustCompile(v)) } } ```

搞定了!!!谢谢谢谢!我昨天起码折腾了5个小时。。 离你给的代码最近的写法是这样 var regexes []*regexp 。。 尴尬啊 百度死了都没百度到。 感谢?

momaek
momaek · #12 · 7年之前
woaiyou5woaiyou5 #11 回复

#7楼 @momaek 搞定了!!!谢谢谢谢!我昨天起码折腾了5个小时。。 离你给的代码最近的写法是这样 var regexes []*regexp 。。 尴尬啊 百度死了都没百度到。 感谢?

感觉你需要去看下 golang 的基础

woaiyou5
woaiyou5 · #13 · 7年之前

@momaek 才使用一个星期。没啥经验,肯定会反复看下基础 ^ ^

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传