19

我有一个缓存在内存中的数据表/集合,我想用它作为源来为自动完成文本框生成结果(当然使用 AJAX)。我正在评估各种快速获取数据的选项。数据表中集合/行中的项目数可能从 10000 到 2,000,000 不等。(所以我们不会被转移,暂时假设已经做出决定,我有足够的内存,我将使用缓存而不是数据库查询)

我对此处理有一些额外的业务逻辑;我必须根据priority集合中的列(int)对自动完成列表进行优先级排序。因此,如果我有人搜索Micro并且我得到 20 个以开头的单词/句子的结果,Micro那么我会选择具有最高优先级的前 10 个结果项目。(因此需要有一个与字符串值关联的优先级属性)。

集合项目已按字母顺序排序。

在这种情况下,最好的解决方案是什么。
1.使用DataTable.Select (
。2 .使用
DataTable.Rows.Find ( _ _性能与否

4

5 回答 5

8

这些图表没有发布在我的博客条目上;更多详细信息,请访问http://msdn.microsoft.com/en-us/library/dd364983.aspx

我后来发现的另一件事是,对于大型数据集,使用链式通用字典的性能非常好。它还有助于缓解由聚合操作所需的排序操作引起的许多问题,例如 min 和 max(使用DataTable.ComputeLINQ)。

我所说的“链式通用字典”是指一种Dictionary(Of String, Dictionary(Of String, Dictionary(Of Integer, List(Of DataRow))))或类似的技术,其中每个字典的键都是一个搜索词。

当然,这并不是在所有情况下都有用,但我至少有一种情况,实施这种方法可以500x提高性能。

在您的情况下,我会考虑使用前 1-5 个字符的简单字典,然后是List(Of String). 您必须建立这个字典一次,将单词添加到具有前 1-5 个字符的列表中,但之后您将能够获得极快的结果。

我通常将这样的东西包装在一个类中,这样我就可以轻松地做一些事情,比如添加单词。您可能还想使用SortedList(Of String), 来自动对结果进行排序。这样,您可以快速查找与已键入的前 N ​​个字符匹配的单词列表。

于 2009-06-11T15:57:19.910 回答
4

在我的上autocomplete,我首先尝试了这种linq/lambda方法,性能有点慢。DataTable.Select比 快linq,所以我用这个。我还没有比较和之间的datatable.Select性能datatable.Find

于 2009-03-16T15:33:21.577 回答
2

我们可以整天猜测它,但既然这不是一段庞大的代码,为什么不编写每个代码并相互进行基准测试呢?

public delegate void TestProcedure();

public TimeSpan Benchmark(TestProcedure tp)
{
    int testBatchSize = 5;
    List<TimeSpan> results = new List<TimeSpan>();
    for(int i = 0; i<testBatchSize; i++)
    {
        DateTime start = DateTime.Now;
        tp();
        results.Add(DateTime.Now - start);
    }
    return results.Min();
}
于 2009-03-09T15:33:41.887 回答
1

根据以下博客

http://blog.dotnetspeech.net/archive/2008/08/26/performance----datatable.select-vs-dictionary.aspx

DataTable.Rows.Find 比 DataTable.Select 快得多。

于 2009-06-09T20:54:36.500 回答
0

数据视图呢?您可以应用您的过滤条件并按优先级排序,并轻松地遍历结果以添加到您的结果中。

于 2009-03-09T15:40:28.687 回答