加快VB.Net 2008中字典的循环

dgo*_*rka 2 .net vb.net dictionary

我有一个进程导入每日产品注册文件,并将它们添加到我们的数据库中.最初,此过程将针对每个记录多次查询数据库,以确定如何处理数据.

为了加快此过程并防止尝试使用使用相同数据库的报告站点的人可能出现的任何超时问题,我已更改代码以将一些表拉入词典,然后迭代他们看看客户/地址/经销商是否存在,如果是,则从字典的键中提取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
Run Code Online (Sandbox Code Playgroud)

这本词典里面有大约1100万条记录.

我的一个同事的想法是Dictionary.ContainsValue()在循环之前运行,看它是否在那里.如果它不完全跳过循环.我只想尝试这个,如果它运行得比仅仅执行循环本身更快,如果他们花费相同的时间我没有看到基本上运行循环两次的一点.

所以我的问题是:

  • 我是否以最有效的方式解决这个问题?
  • Dictionary.ContainsValue()在尝试循环之前运行a会更快,还是系统会将它们解释为相同的东西,从而使我的时间加倍?
  • 还有什么我应该找的吗?

Jon*_*eet 5

一个明显的小优化将是执行的拼接firstName,lastName一旦外循环.目前,你在循环的每次迭代中连接,这显然比它可能更慢.

不,使用ContainsValue不会更快 - 仍然需要进行线性搜索.

显而易见的优化是反转字典 - 创建一个Dictionary(Of String, Int64)基本上具有每个字符串值的ID.目前,您没有使用字典的自然优势 - 您实际上将其视为键/值对列表.

你是否也以正常方式使用字典(按键查找)?