Java 多字符串同时匹配文本,消耗 CPU 过高,如何优化?

30次阅读

共计 914 个字符,预计需要花费 3 分钟才能阅读完成。

本人遇到一个性能方法的问题,这是打标的场景,主要逻辑是三个循环,YYDTO 中有段文本,XXDTO 中有关键词列表,XXDTOList 量级大约 10 万条必须执行,判断关键词列表是否全部在文本中存在,如果存在则执行业务逻辑;
目前测试了 stream、parallelStream、正则和原生的 for 循环,发现下面 checkExistRule 是最快的,大约 50ms,但是会一直消耗大量 CPU(串行下一直占用 100%)。之前还考虑使用 AC 自动机,但是因为单条匹配到还要处理业务逻辑,所以不太合适。

text 举例:"#DIESEL 大牌好友# @宋雨琦_G-I-DLE 演绎 #DIESEL2023 秋冬系列# 牛仔坠饰 D-VINA 包袋。渐变丹宁渲染不羁格调,另类包型注解无畏想象"


keywordRule 中举例:[鼎赛龙, 男士春夏, D-FINING, 深灰色, 锥形牛仔裤] string[]
[DIESEL, 男士春夏, DFINING, 深灰色, 锥形牛仔裤] string[]
上面这是关键词列表中的一个,总共 10 万个,也就是 10 万个 List 中每个 List 包含 N  个字符串数组

请问有什么方式进行优化?能不能做到时间复杂度 O(1) 或者 O(m + n) 级别?


    for (YYDTO yydto : YYDTOList) { //2000
        String text = yydto.getText();
        for (XXDTO xxdto : XXDTOList) {//10w
          List keywordRule = xxdto.getKeywordRule();
            if (checkExistRule(keywordRule, text)) {
                // 处理业务逻辑
                // yydto.set(xxdto.getName());
            }
        }
    }

    private boolean checkExistRule(List keywordRule, String text) {
        try {for (String[] strings : keywordRule) {for (String string : strings) {if (!text.contains(string)) {return false;}
                }
                return true;
            }
        } catch (Exception e) { }
        return false;
    }
    
正文完
 0