模式搜索如何更快?

时间:2010-10-21 15:06:26

标签: java regex

我正在处理大约1GB的增量文件,我想搜索特定的模式。 目前我正在使用Java正则表达式,你知道我怎么能更快地做到这一点?

4 个答案:

答案 0 :(得分:8)

听起来像Apache Lucene的工作。

您可能需要重新考虑您的搜索策略,但此库是为了执行此类操作并逐步添加索引。

它的工作原理是构建数据的反向索引(Lucene用语中的文档),然后快速检查反向索引中哪些文档具有模式的一部分。

您可以使用文档索引存储元数据,这样您就不必在大多数用例中查阅大文件。

答案 1 :(得分:7)

基本上你需要的是一个可以处理流的状态机。这个流被绑定到文件中...每次文件增长时,你都会读取附加到它上面的内容(比如将标准输出附加到文件中的行附加的tail linux命令)。

如果您需要停止/重新启动分析仪,您可以将其存储在起始位置的某个位置(可能取决于模式匹配所需的窗口)并从中重新启动。或者你可以从头开始重启。

这是问题的“增加文件”部分。

对于处理内容的最佳方式,它取决于您真正需要的内容,您想要应用的数据和模式类型。正则表达式可能是最佳解决方案:灵活,快速且相对方便。

根据我的理解,如果您想为某些自然语言内容进行文档搜索匹配,Lucene会很好。如果将所有日期或所有行与特定属性匹配,这将是一个糟糕的选择。还因为Lucene首先制作了一份文件索引...这对于真正繁重的处理只会有所帮助,因为首先需要时间索引。

答案 2 :(得分:4)

您可以尝试使用Pattern和Matcher类来搜索已编译的表达式。

请参阅http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.htmlhttp://download.oracle.com/javase/tutorial/essential/regex/

或使用您最喜爱的搜索引擎搜索条款:

java正则表达式优化

java正则表达式性能

答案 3 :(得分:4)

我认为这取决于:

  • 您的数据结构(面向行?)
  • 比赛的复杂性
  • 数据文件增长的速度

如果您的数据是面向行的(或面向块的)并且必须在这样的单元内进行匹配,则可以匹配直到最后一个完整的块,并存储该端点的文件位置。下一次扫描应该从该端点开始(可能使用RandomAccessFile.seek())。

如果数据没有快速增长,这尤其有用。

如果您的匹配非常复杂但具有独特的固定文本,并且该模式不会发生,那么可能通过String.contains()更快,并且只有当这是真的时才适用模式。由于模式往往高度优化,因此绝对不能保证更快。

您甚至可以考虑通过手工编写解析器替换正则表达式,可能基于StringTokenizer或其他类似的解析器。这肯定是很多工作要做到正确,但它可以让你将一些关于数据的额外情报传递给解析器,从而使它快速失败。如果您真的非常了解无法在模式中编码的数据,那么这只是一个不错的选择。