首页>Program>source

我有大约一个清单. 500,000根弦,每根约 100个字符长.给定一个搜索词,我想标识列表中包含搜索词的所有字符串.目前,我正在使用Select方法(" MATCH%term%")使用简单的旧数据集进行此操作.我的笔记本电脑大约需要600毫秒.我想加快速度,也许100-200ms。

推荐的方法是什么?

性能至关重要,因此我可以在必要时(在合理的范围内)交换内存占用量以获得更好的性能.字符串列表一旦初始化就不会改变,因此计算哈希值也是一种选择。

有人建议吗?哪种C#数据结构最适合该任务?

最新回答
  • 11天前
    1 #

    在执行快速全文本搜索时,我听说过有关Lucene.NET的好消息.他们已经完成了找出最快的数据结构等工作的工作.我建议试一试。

    否则,您可以尝试如下操作:

    var matches = list.AsParallel().Where(s => s.Contains(searchTerm)).ToList();
    

    但是它可能不会使您降低到100毫秒。

  • 11天前
    2 #

    您是否尝试过以下方法?

    list.FindAll(x => x.Contains("YourTerm")).ToList();
    

    由于某种原因,我的PC上的List.AsParallel()。where(...)比list.FindAll(...)慢。

    list.AsParallel().Where(x => x.Contains("YourTerm")).ToList();
    

    希望这对您有所帮助。

  • 11天前
    3 #

    特里树或后缀树将有助于使其更快-本质上,这是全文搜索(通常)所使用的。

    您可以使用C#中的实现,也请参见下面的SO线程:在C#中寻找后缀树实现?

    正如@leppie所提到的,并行执行可能已经为您提供了您正在寻找的x3性能提升.但是话又说回来,您将不得不进行仔细的测量,而这没有别人的猜测。

  • 11天前
    4 #

    您是否尝试过将字符串加载到 List<string>中 然后使用Linq扩展 Contains 方法?

    var myList = new List<string>();
    //Code to load your list goes here...
    var searchTerm = "find this";
    var match = myList.Contains(searchTerm);
    

  • 11天前
    5 #

    public static bool ContainsFast<T>(this IList<T> list, T item)
    {
        return list.IndexOf(item) >= 0;
    }
    

    根据我所做的测试,这是 Contains的变体 在我这边快了33%。

  • c#:NET的webBrowser类的异步/等待实现
  • ajax:从ASPNET MVC返回null时,jQuery post JSON失败