我有一个缓存在内存中的DataTable /集合,我想用它作为源来生成自动完成文本框的结果(当然使用AJAX)。 我正在评估各种选项以快速获取数据。 数据表中集合/行中的项目数可以从10000到2,000,000不等。 (这样我们就不会转移,暂时假设已做出决定,我有足够的RAM,我将使用缓存而不是数据库查询)
我有一些额外的业务逻辑用于此处理;我必须根据集合中的priority
列(int)确定自动完成列表的优先级。因此,如果我有人搜索Micro
并且我会说出以Micro
开头的单词/句子的20个结果,那么我会选择具有最高优先级的前10个结果项。 (因此需要具有与字符串值相关联的优先级属性)。
收集品已按字母顺序排序。
在这种情况下,最佳解决方案是什么
1.使用DataTable.Select(。
2. Using DataTable.Rows.Find(。
3.使用foreach or for的自定义集合来迭代其值
4.使用anonymous delegates或lambda(since both give same performance或not的通用集合?)
答案 0 :(得分:8)
图表未发布在我的博客文章中;更多详情可在http://msdn.microsoft.com/en-us/library/dd364983.aspx
找到我发现的另一件事是,对于大型数据集,使用链式通用字典表现非常好。它还有助于缓解聚合操作所需的排序操作(如最小值和最大值(使用DataTable.Compute
或LINQ
)所导致的许多问题。
“链式通用词典”是指Dictionary(Of String, Dictionary(Of String, Dictionary(Of Integer, List(Of DataRow))))
或类似技术,其中每个词典的关键词是搜索词。
当然,这在所有情况下都没有用,但我至少有一种情况,即实施此方法可以提高500x
性能。
在你的情况下,我会考虑使用前1-5个字符的简单字典,然后是List(Of String)
。你必须建立一次这个字典,用前1-5个字符将这些单词添加到列表中,但之后你将能够获得超快的结果。
我通常将这样的事情包装在一个允许我轻松添加单词的类中。您可能还想使用SortedList(Of String)
来自动排序结果。这样,您可以快速查找与已键入的前N个字符匹配的单词列表。
答案 1 :(得分:4)
在我的autocomplete
上,我首先尝试了linq/lambda
方法,但性能有点慢。 DataTable.Select
比linq
快,所以我使用它。我还没有比较datatable.Select
和datatable.Find
答案 2 :(得分: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();
}
答案 3 :(得分:1)
根据以下博客
http://blog.dotnetspeech.net/archive/2008/08/26/performance----datatable.select-vs-dictionary.aspx
DataTable.Rows.Find比DataTable.Select快得多。
答案 4 :(得分:0)
DataView怎么样?您可以应用过滤条件并按优先级排序,并轻松迭代结果以添加到结果中。