使用defaultdict 記憶體被爆掉 ,記憶體溢位,陣列太大了
阿新 • • 發佈:2019-01-31
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沒賦值就是預設值,預設值的項沒訪問過就不會分配記憶體,訪問過,即使是預設值也會分配記憶體。謹記。