[英]Speed up looping through a dictionary in VB.Net 2008
我有一個進程導入每日產品注冊文件,並將它們添加到我們的數據庫中。 最初,此過程將針對每個記錄多次查詢數據庫,以確定如何處理數據。
為了加快此過程並防止嘗試使用同一數據庫的報告站點的人可能出現的任何超時問題,我已更改代碼以將一些表下拉到詞典中,然后迭代他們看看客戶/地址/經銷商是否存在,如果是,則從字典的鍵中提取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
外循環一次等。 目前,你在循環的每次迭代中連接,這顯然比它可能更慢。
不,使用ContainsValue
並不會更快 - 仍然需要進行線性搜索。
顯而易見的大優化是反轉字典 - 創建一個Dictionary(Of String, Int64)
,它基本上具有每個字符串值的ID。 目前,您沒有使用字典的自然優勢 - 您實際上將其視為鍵/值對列表。
你是否也以正常方式使用字典(按鍵查找)?
看起來你正在使用字典與它應該如何使用 - 或者我錯過了什么?
通過迭代字典中的鍵值對,您將使字典(散列表)提供的好處無效 - 快速查找給定鍵值的好處。
您應該使用(String,Int64)字典,將firatname,lastname,...映射到custId。 與您目前正在進行的操作相比,查找此內容會非常快。
你可以做的一件事就是加速搜索字符串:
Dim SearchValue as String = firstName & "|" & lastName & "|" & companyName & "|" & addrId & "|" & typeID & "|" & phone & "|" & email
For Each kvp As KeyValuePair(Of Int64, String) In dCust
If kvp.Value = SearchValue Then
custId = kvp.Key
Exit For
End If
Next
使用字典的目的是快速查找KEY而不是值。 要么只使用正常的數組列表,要么更改代碼,以便進行鍵查找而不是值查找。
我認為關於字典的答案很好,但我認為更廣泛的答案是在數據庫層處理這些東西而不是下載數百萬條記錄來迭代使用C#中的字典。 為什么不使用表值參數 (我假設您使用的是SQL Server 2008)來傳遞您想要比較的數據並查看它是否存在? 你將它傳遞給存儲過程或者在SQL端進行比較的東西。 你甚至可以這樣做:
INSERT ProductRegistrations
SELECT * FROM @tvpProductsToAdd pa WHERE
pa.firstName + pa.lastName + pa.companyName NOT IN
(SELECT firstName + lastName + companyName FROM ProductRegistrations)
@tvpProductsToAdd是您使用新產品傳遞的表值參數。 您可能希望在這些字段上創建某種索引以加快比較速度,因為您似乎沒有可以比較的鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.