1

我有大约 50000 个关键字应用了正则表达式模式。我的应用程序获取了一些文本内容并尝试查找与该内容相关的关键字。

我这样做是遍历所有关键字并在内容中搜索每个关键字。

因为要匹配的内容太多,如果存在我愿意找到更好的方法。

有没有更好的方法呢?

这是我目前正在做的示例代码:

 List<string> keywords = getKeywords();
        string textToMatch = getNews();

        List<string> result = new List<string>();

        foreach (var keyword in keywords)
        {
            Match r =  Regex.Match(textToMatch, keyword);
            if(r.Success)
                result.Add(keyword)
        }
4

2 回答 2

2

首先,您可以使用RegexOptions.Compiledwhich 指示正则表达式引擎使用轻量级代码生成将正则表达式表达式编译为 IL。程序将启动较慢,但使用正则表达式的匹配更快。

下一步将是消费者生产者设计模式的一些很好的实现。可悲的是,我不知道您的操作中最慢的是什么,但是如果您尝试实现此模式,它应该会更快(下面的一些伪代码)

        BlockingCollection<string> collection = new BlockingCollection<string>();
        Action productionAction = () =>
        {
           //produce data then
            collection.Add(ProcessedData);
        };
        Action consumentAction = () =>
        {
           //consume data
            var data = collection.Take();
            //then
            //do your things

        };
        Parallel.Invoke(productionAction,consumentAction);
        // code will end here when everything will be processed
        // also you can change Action to TaskRun to use some Multithreading

您还可以尝试使用Parallel.ForEach替换循环来显着提高性能的最简单方法(或不!我不了解您的其余代码!)

于 2015-11-06T15:51:43.673 回答
0

如果我们认为只有一个文本与多个关键字匹配,则没有完全不同的工作方式。我们可以只使用Parallel.For,编译的正则表达式等。

就我而言,我收到太多无法与关键字匹配的短信。假设我有 50 个文本和 50000 个关键字。通常我会为每个文本进入关键字循环。现在,首先我将所有文本合并为一个大文本。然后为它运行匹配。将返回匹配的关键字列表。最后,再次为每个文本运行匹配,但仅针对匹配的关键字列表。

于 2015-11-10T07:09:25.750 回答