Hello!
2013/3/5 duan yuxuan:
> 我主要是使用了pike vm进行流式搜索
> 在您提供的接口函数中是否有对搜索上下文进行重置的接口?
> sre_vm_pike_create_ctx(pool,....)
> 在流式情况下,状态机只需要创建一次,然后进行若干次的搜索
> 操作(我的意思是:可能这次搜索匹配中了某个模式串,然后我
> 进行一些列的操作后,又重新匹配这些模式串),在当前的代码
> 中,应该是进行了几次这样的操作就创建几次上下文,销毁几次
> 上下文(sre_destroy_pool(pool)),这样频繁的进行内存的
> 申请和释放会不会导致性能的下降,若采用reset上下文的方式
> 会不会要好些?
这里显式的 reset ctx API 是不必要的。Pike VM
会在找到匹配之后自动重置相关的上下文,并同时保持必须记住的那些上下文信息(比如 0 宽度断言 \b 等东西所需的信息)。
所以当找到一个匹配并进行相应的处理之后,你只需继续调用 sre_vm_pike_exec 喂更多的数据块就可以了(注意返回的
submatch capture 中的字符串偏移量并不会重置回 0,毕竟你还是在同一个数据流上进行匹配)。
ngx_replace_filter 模块的全局替换模式(g 选项)就使用了 sregex 的这个特性,你可以参考一下这个模块中的实现:
https://github.com/agentzh/replace-filter-nginx-module
这个 nginx 模块目前是 sregex 最完整的应用示例。
同时抄送给 openresty 中文邮件列表:https://groups.google.com/group/openresty
Best regards,
-agentzh