我有一種情況,其中字典創建,鍵值對添加,並且之後點字典僅用於讀取值。快速並行添加到字典,當鍵不會碰撞
我試圖實現在初始化階段添加到字典的最快捷方式。
ConcurrentDictionary的TryAdd方法非常慢(還有GetOrAdd) - 在我的6個核心CPU(12個線程)上,CPU使用率通常保持在25%,表明只有3個線程被使用。
與使用ConcurrentDictionary和Parallel.For相比,將所有密鑰(大約2500萬)順序添加到Dictionary實際上更快。
我該如何提高速度? 很容易分開鍵值對,使密鑰時添加到字典中從來沒有發生衝突,但只是用下面的代碼產生了一些問題:
Dictionary<long,string> d = new Dictionary<long,string>();
d[key] = value;
看來,這在多線程環境中使用時,因爲Dictionary有時會進行一些內部更改(調整大小?)失敗。
將這項工作呢?
capacity = 250000000 //basically big enough to store all data
Dictionary<long,string> d = new Dictionary<long,string>(capacity);
d[key] = value;
我更喜歡使用Dictionary over ConcurrentDictionary,因爲讀取速度也快得多(速度對於我的應用程序來說也是非常重要的)。
當你說他們不會碰撞時,你的意思是說他們從來沒有相同的價值,或者他們實際上不會碰撞?字典是散列表,並且可以與兩個不同名稱的鍵發生衝突。 –
你玩過'ConcurrentDictionary'的'concurrencyLevel'構造函數嗎? –
@MikePrecup我的意思是,我可以分開所有要添加的密鑰,以便每個線程都有唯一的密鑰來添加,並且每個密鑰都有唯一的哈希碼(類似於將1到100的數字添加到字典中 - 沒有重複項或哈希碼碰撞) – Michal