【发布时间】:2011-05-17 21:21:34
【问题描述】:
我有一个流程可以导入产品注册的每日文件,并将它们添加到我们的数据库中。最初,此过程会针对每条记录多次查询数据库以确定如何处理数据。
为了加快此过程并防止尝试使用使用相同数据库的报告站点的人可能出现的任何超时问题,我更改了代码以将一些表下拉到字典中,并且然后遍历它们以查看该客户/地址/经销商是否存在,如果存在则从字典的键中提取 Id,或者将其插入表中,如果不存在则将其插入字典中。
但是,我目前发现它的运行速度要慢,因为每次注册都要多次查询数据库。我能想到的一个可能原因是我的字典很大(一个有 800 万个条目,另一个有 1100 万个)。
这是我正在做的一个例子:
For Each kvp As KeyValuePair(Of Int64, String) In dCust
If kvp.Value = firstName & "|" & lastName & "|" & companyName & "|" & addrId & "|" & typeID & "|" & phone & "|" & email Then
custId = kvp.Key
Exit For
End If
Next
这本词典有大约 1100 万条记录。
我的一个同事的一个想法是在循环之前运行Dictionary.ContainsValue() 以查看它是否存在。如果它没有完全跳过循环。如果它比循环本身运行得更快,我只想尝试这个,如果它们花费相同的时间,我看不到基本上运行循环两次的意义。
所以我的问题是:
- 我最关心这个 有效的方法?
- 会更快吗
之前运行
Dictionary.ContainsValue()尝试循环,或者将 系统将它们解释为相同 事情,从而使我的时间翻倍? - 我还有什么需要寻找的吗?
【问题讨论】:
-
您正在计算
firstName & "|" & lastName & "|" & companyName & "|" & addrId & "|" & typeID & "|" & phone & "|" & email1100 万次?尝试在循环之前只计算一次。 -
@Gabe,你比我快 50 秒!
-
Dictionary.Values 总是唯一的吗?如果是这样,反转您的键值对(如几个回复所述)是一个好主意。
标签: .net vb.net dictionary