2009-11-25 84 views
0

我正在寻找一种方法来搜索TB模式匹配正则表达式的数据。实现确实需要支持正则表达式的许多更好的功能,例如开始和结束行数据,全TR1支持(最好具有POSIX和/或PCRE支持)等等。我们正在有效地使用此应用程序来测试有关存储潜在敏感信息的政策。基于模式(正则表达式)的搜索系统

我已经研究过索引解决方案,但大多数商业套件似乎没有我们想要的更精细的正则表达式能力(到目前为止,他们在解析复杂的正则表达式时完全失败了,重新使用)。

这是一个复杂的问题,因为我们拥有的数据量非常庞大,我们必须为扫描任务贡献大量的系统资源(并不是太多,它只是检查策略遵从性,所以在那里在硬件方面预算不大)。

我看着Lucene,但我对使用索引系统有点犹豫,因为索引系统不能完全处理我们的正则表达式电池,并且在搜索整个数据集时可以解决这个问题,所以我们不得不让服务器至少在几周内一直执行这些操作。

有什么建议吗?

回答

1

PowerGREP可以处理任何正则表达式,并已完全为此目的而设计。我发现它能够快速搜索大量数据,但我还没有尝试过太字节数。但是,由于有30天的试用期,所以我认为值得一试。

它在搜索文件的特定部分时尤其强大。您可以根据自己的标准对文件进行分区,然后仅对这些分区应用其他搜索。另外,它具有非常好的报告功能。

+0

这可能是我们给定参数中最实际的解决方案,尽管我不太需要满足用户的大量干预,但应用似乎满足了我们的需求。 – tearman 2009-11-25 20:21:05

+0

也许如果您联系制作PowerGREP的公司,您可以让他们向您授权您可以从应用程序调用的组件。通常,中小型软件公司都会接受这样的机会。 – shadit 2009-12-01 16:59:40

0

grep程序针对正则表达式在文件中搜索进行了高度优化,以至于我无法用任何通用的正则表达式库来打败它。即使这样做对于搜索terabytes也是不切实际的,所以我认为你在完成正则表达式搜索时运气不好。

一个选项可能是使用索引器作为第一遍来查找可能的匹配,然后在每个匹配的任一侧提取一些字节并在其上运行完整的正则表达式匹配。

+0

考虑到我们正在寻找的一组数据,尝试对可能的匹配进行排序可能证明是一个挑战,但这个想法确实可靠。 – tearman 2009-11-25 20:22:04

1

你可能想看看Apache Hadoop。像雅虎和Facebook这样的大型网站使用Hadoop处理各种事物,其中之一是处理多TB的文本日志。

在Hadoop文档中,有一个分布式Grep的示例,可以缩放以处理任何可协调的数据集大小。

如果您想推出自己的解决方案,Hadoop API中还有一个SequenceFileInputFilter.RegexFilter。

+0

这在一个有趣的选项中,尽管我们的系统(不幸)是Win32,并且所有的数据都集中在一个数据集大小相对较小的集群中,所以我想知道Hadoop如何处理大型数据集的相对较小的资源集在开发平台上。 – tearman 2009-11-25 19:16:09

1

我只能提供一个高级答案。在Tim和shadit的答案的基础上,使用在EC2或Azure Compute上实现为MapReduce算法的双通道方法。在每个过程中,映射可能带有一个标识符的数据块,并返回减少标识符如果找到匹配,否则为空值。根据需要缩放处理时间,缩小处理时间。

+0

不错的选择,对于我们最终要完成的事情来说似乎有些过火,预算限制可能会对此产生不利影响。尽管如此。 – tearman 2009-11-25 20:18:42

+0

是的,这绝对不是一件小事。如果您的企业能够从适当的解决方案中获益(对于未来的客户/需求),这真的是有意义的。 – 2009-11-25 20:25:58

+0

不幸的是,这是一个内部唯一的解决方案,我已经尝试投入一些花哨的东西,它被击落。尽管可能是商业应用的好主意。 – tearman 2009-11-25 20:34:41

0

免责声明:我不是搜索专家。

如果你真的需要正则表达式的所有通用性,那么没有什么比拖网遍历所有数据更好了(但请参阅下面关于加快速度的评论)。

但是,我想这不是真的。因此首先要做的是看看您是否可以使用索引来识别可能的文档。例如,如果你知道你所有的匹配都会包含一个单词(任何单词),那么你可以对这些单词进行索引,使用它来找到包含该单词的(希望是小的)一组文档,然后使用grep或相当的只在这些文件上。

因此,例如,您可能需要在行的开头找到具有“FoObAr”的文档。您将从一个无格式索引开始,以识别在任何地方都有“foobar”的文件,然后仅grep(仅)用于“^ FoObAr”的文件。

接下来,如何尽快grep。你可能会受到io速度的限制。所以看看使用多个磁盘(可能不需要使用RAID - 每个磁盘只能有一个线程)。另外,考虑压缩。你不需要随机访问这些文件,并且如果它们是文本(我假设它们是如果你正在刷新它们),那么它们将很好地压缩。这将减少您需要读取(和存储)的数据量。

最后,请注意,如果您的索引不适用于所有查询,那么它可能不值得使用。您可以在一次扫描中“grep”所有表达式,而昂贵的过程是读取数据,而不是grep的细节,因此即使“只有一个”查询无法编入索引,因此您需要扫描一切,然后建立和使用索引可能不是一个很好的利用你的时间。