3

我有超过 1500 个给定的正则表达式模式,需要在相同的 100 - 200 kb 文本文件上运行并返回成功模式列表。文件来自外部,所以我不能对该文件做任何假设。

问题是,我能否以某种方式使处理速度比对同一文本运行所有这些正则表达式更快?

逻辑上输入文件是一样的,后面的正则表达式可以使用一些已经处理过的信息。如果我们认为每个正则表达式都是有限自动的,那么对于相同的文本运行 1500 次有限自动,肯定比运行一个连接的自动慢。所以问题是,我能以某种方式创建加入的正则表达式吗?

4

2 回答 2

4

这是利用线程的绝佳机会。将要处理的文件读入字符串,然后启动一系列消费者线程。让您的主线程将每个正则表达式放入队列中,然后让消费者断开队列的下一部分,编译正则表达式,然后在字符串上运行它。共享内存意味着您可以在同一个字符串上运行多个表达式,即使在弱计算机(2 核,非超线程)上,如果您将消费者池保持在合理的大小,您也会注意到速度显着提升。在一个非常大的服务器上——比如 32 个超线程内核?您可以拥有一个不错的脂肪池,并立即通过这些正则表达式进行爆炸。

于 2013-11-12T16:48:30.583 回答
3

我认为这在理论上是可能的,但似乎是一项不平凡的任务。一种可能的方法是:

  1. 将所有正则表达式转换为有限状态机。
  2. 将这些组合成一个 fsm。
  3. 优化生成的状态。

优化将是关键步骤,因为输入很长(100-200kb)。内存可能是一个问题,否则性能可能会变得更糟。我不知道是否存在为此目的的库,但这是一个理论上的答案

于 2013-11-12T17:28:25.633 回答