1. 程式人生 > >使用defaultdict 記憶體被爆掉 ,記憶體溢位,陣列太大了

使用defaultdict 記憶體被爆掉 ,記憶體溢位,陣列太大了

trainDataFeat = defaultdict(lambda:defaultdict(lambda:0))
for user_id in userIdTrainList:
	for field in fieldList:
                	feat.append(trainDataFeat[user_id][field])

說明:userIdTrainList的長度是10w+, fieldList:的長度是5000+。

defaultdict缺少的元素會預設為0,如果沒有訪問到,那麼不會分配記憶體,但是一旦訪問到,就會分配記憶體,所以,跑完兩個for迴圈,我就會有一個上億元素的陣列,記憶體會爆掉。

改寫一下:

trainDataFeat = defaultdict(lambda:defaultdict(lambda:0))
for user_id in userIdTrainList:
	for field in fieldList:
		if field in trainDataFeat[user_id].keys():
                        feat.append(trainDataFeat[user_id][field])
                else:
                        feat.append(0)

因為只是少數field intrainDataFeat[user_id].keys():所以,整個陣列並不會很大。

總結:記憶體爆掉,可能是分配的矩陣太大了,defaultdict沒賦值就是預設值,預設值的項沒訪問過就不會分配記憶體,訪問過,即使是預設值也會分配記憶體。謹記。