浏览 2129 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-29
第一:取出此text类型字段作为content,拿content和规则中的关键字进行正则匹配,得到一个新的表达式,类似于(0 and 1) or ( 1 and 0 and 1)的临时表达式,然后使用Antlr构造AST对临时表达式求值,得到最终结果,true或者false。 第二:使用mysql的关键字regexp,取出此text类型字段作为content,生成sql语句,类似于select id from table where( ( (content regexp A) and (content regexp A) ) or ( (content regexp C) and (content regexp D) and (content regexp E) ) )。 因为要将张表满足规则的记录插入到另外一张表,所以用到了mysql的insert into select,结果一个杯具发生了,死锁了。。 insert into select的原意是复制整张表,但是这里进行了复杂的正则验证,加入了业务逻辑,导致这张表的读锁,而在读的同时还会有另外一个程序向这张表写数据,就必须等待,此时恰好又采用多线程读这张表,又要再进行读,此时锁就产生了。 现在的思路:从这张很大的表中取出小范围的数据,少量多批次处理,直接取出的数据不进行匹配后放到临时表再对临时表做正则匹配,不使用insert into select,而将数据持久化到文件,再导入到临时表,或者将少量数据读取存放到内存中,在内存中使用AST进行匹配。 现在的问题:两者的结果是否相同?AST在大数据量处理能否正常运行,现在是小数据多批次,但还是需要测试?另外如何防止内存泄露?如果采用临时表和文件,mysql的建表和 load data infile效率如何?都需要测试,明天开始测试。。 希望有经验的高手们拍砖。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |