有詞典< Int64,字節>被大量使用。我的意思是在大數據負載下運行數日的循環。 Int64來自兩個Int32。該字節恰好是來自許多非常長列表的這兩個Int32之間的距離(計數)。將兩個Int32結合到Int64中
我需要在這個循環做的是
- 生成密鑰
- 如果鍵不存在於字典然後插入鍵和值
- 如果鍵不存在,新的值(字節)小於現有值,則用新值替換現有值
現在我正在使用直數學生成密鑰,我知道有更快的方法,但我無法想象它出。我把換檔作爲標籤,因爲我認爲這是如何優化它,但我無法弄清楚。
然後,當循環完成時,我需要從Int64中提取兩個Int32以將數據插入到數據庫中。
感謝
根據註釋我用的是數學兩個的Int32組合成一個Int64的
Int64 BigInt;
Debug.WriteLine(Int32.MaxValue);
Int32 IntA = 0;
Int32 IntB = 1;
BigInt = ((Int64)IntA * Int32.MaxValue) + IntB;
Debug.WriteLine(BigInt.ToString());
IntA = 1;
IntB = 0;
BigInt = ((Int64)IntA * Int32.MaxValue) + IntB;
Debug.WriteLine(BigInt.ToString());
IntA = 1;
IntB = 1;
BigInt = ((Int64)IntA * Int32.MaxValue) + IntB;
Debug.WriteLine(BigInt.ToString());
而最好的關鍵可能不是一個Int64。我所擁有的是兩個Int32一起構成一個關鍵。和一個字節的值。我需要快速查找該組合鍵。字典很快,但它不支持組合鍵,所以我創建了一個實際上是組合鍵的單個鍵。在SQL Int32A中,Int32B構成PK。
我不使用複合鍵的原因是我想查找字典的速度和我的知識字典不支持複合鍵。這是生產代碼。在SQL表中實際上有第三個鍵(Int32 sID,Int32 IntA,Int32 IntB)。在這個解析器中,我一次只處理一個sID(並且按照順序處理sID)。我開始用SQL查詢組合鍵(一次運行數十億次)。當我將IntA,IntB輸出到Dictionary來處理單個sID時,在完成每個sID時加載到SQL,我得到了100:1的性能提升。性能改進的一部分是插入,因爲當我從字典中插入時,我可以按PK順序插入。新的IntA和IntB不會按照解析進行排序,因此直接插入SQL會嚴重地破壞索引,我需要在運行結束時重建索引。
「直數學」是什麼意思?請顯示一些代碼來說明兩個int32和int64之間的關係。 – 2012-04-01 17:43:27
@OliCharlesworth我添加了一個我使用的直數學的簡單樣本。 – Paparazzi 2012-04-01 17:59:05
'Int32.MaxValue'是2^32-1。你確定這就是你想要的嗎? – 2012-04-01 18:00:26