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

时间:2012-10-24 23:17:22

标签: java regex large-data-volumes

我有一个大的(大于200K)字符串数组,我用它来搜索文档中的模式。在将数组中的每个条目应用到文档之前,我将其转换为正则表达式。当我这样做时,通过阵列并顺序执行搜索所花费的时间大大增加。我相信这是我在执行搜索之前依次应用于每个正则表达式的Pattern.compile语句。预编译正则表达式可能是解决这个问题的方法,但是当我这样做时,我注意到内存使用量急剧增加。在预编译之前,Java应用程序在大约1.5千兆字节的VM中运行。在预编译之后,java程序在大约14 gigs的VM中运行。

是否有一些优雅的方法来解决这个问题或使程序更有效地运行?

谢谢,

埃利奥特

1 个答案:

答案 0 :(得分:0)

我会避免将所有正则表达式编译在内存中,只是在使用前逐个编译,并确保垃圾收集器可以清理使用过的垃圾收集器。 这可能会降低峰值内存使用率。

理论上,您可以在单个正则表达式中合并许多正则表达式,使用捕获组和/或运算符(|),然后使用单个传递扫描文档,最后检查哪个匹配调用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
  }
}