我有一个很大(大于 200K)的字符串数组,我用它来搜索文档中的模式。在将数组应用于文档之前,我将数组中的每个条目都转换为正则表达式。当我这样做时,遍历数组并按顺序执行搜索所需的时间会急剧增加。我相信这是对我在执行搜索之前依次应用于每个正则表达式的 Pattern.compile 语句所做的。预编译正则表达式可能是解决此问题的一种方法,但我注意到这样做时内存使用量急剧增加。在预编译之前,java 应用程序在大约 1.5 GB 大小的 VM 中运行。预编译后,java 程序在大约 14 GB 大小的 VM 中运行。
是否有一些优雅的方法来解决这个问题或使程序运行更高效?
谢谢,
埃利奥特
最佳答案
我会避免将所有正则表达式编译在内存中,只需在使用前一个一个编译,并确保垃圾收集器可以清理用过的正则表达式。 这可以降低峰值内存使用量。
理论上,您也可以使用捕获组和或运算符 (|) 将多个正则表达式合并到一个正则表达式中,然后一次扫描文档,最后检查哪个匹配调用 group() .
这还有利于在编译阶段统一不同正则表达式的相似部分。
这是一个简单的示例,假设您正在匹配整个文档而不是查找或替换,只是为了说明这个想法:
String patternA = "patternA";
String patternB = "patternB";
Pattern compiled = Pattern.compile(String.format("(%s)|(%s)",patternA, patternB))
Matcher matcher = compiled.matcher(input);
if (matcher.matches()) {
if (matcher.group(1)) {
// patternA matched
}
if (matcher.group(2)) {
// patternB matched
}
}
关于java - 在大数据集上使用正则表达式时的空间和时间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13059300/