java - 在大数据集上使用正则表达式时的空间和时间问题

标签 java regex large-data-volumes

我有一个很大(大于 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/

相关文章:

java - setUp/tearDown (@Before/@After) 为什么我们在 JUnit 中需要它们?

c - 需要一些帮助来计算百分位数

sql-server-2008 - 大数据量的内连接和拆分

sql-server - 用于大型数据集的 SQL 数据库设计

java - 有什么方法可以在 Eclipse 中创建 wicket 项目

java - 停止 SwingWorker 中 JProgressBar 的不确定模式

java - 在(Eclipse 的)Jar 文件中设置类路径

MySQL基于带分隔符的子字符串选择带有LIKE或REGEX的列字符串

javascript - 正则表达式匹配大括号内的内容,而嵌套大括号不会破坏它

具有不同匹配和替换条件的 Java String.replaceAll