使用defaultdict 内存被爆掉 ,内存溢出,数组太大了

来源:互联网 发布:网络砍价师 编辑:程序博客网 时间:2024/05/16 01:07
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没赋值就是默认值,默认值的项没访问过就不会分配内存,访问过,即使是默认值也会分配内存。谨记。


0 0
原创粉丝点击