我正在尝试对通过从磁盘读取文件创建的大型字典进行一些分析。读取操作会导致稳定的内存占用。然后,我有一个方法可以根据我从该字典复制到临时字典中的数据执行一些计算。我这样做是为了让所有的复制和数据使用都在方法范围内,并且我希望在方法调用结束时消失。
可悲的是,我做错了什么。customerdict 定义如下(定义在 .py 变量的顶部):
customerdict = collections.defaultdict(dict)
对象的格式是 {customerid: dictionary{id: 0||1}}
还有一个类似定义的字典,称为 allids。
我有一种计算 sim_pearson 距离的方法(来自 Programming Collective Intelligence 书的修改代码),如下所示。
def sim_pearson(custID1, custID2):
si = []
smallcustdict = {}
smallcustdict[custID1] = customerdict[custID1]
smallcustdict[custID2] = customerdict[custID2]
#a loop to round out the remaining allids object to fill in 0 values
for customerID, catalog in smallcustdict.iteritems():
for id in allids:
if id not in catalog:
smallcustdict[customerID][asin] = 0.0
#get the list of mutually rated items
for id in smallcustdict[custID1]:
if id in smallcustdict[custID2]:
si.append(id) # = 1
#return 0 if there are no matches
if len(si) == 0: return 0
#add up all the preferences
sum1 = sum([smallcustdict[custID1][id] for id in si])
sum2 = sum([smallcustdict[custID2][id] for id in si])
#sum up the squares
sum1sq = sum([pow(smallcustdict[custID1][id],2) for id in si])
sum2sq = sum([pow(smallcustdict[custID2][id],2) for id in si])
#sum up the products
psum = sum([smallcustdict[custID1][id] * smallcustdict[custID2][id] for id in si])
#calc Pearson score
num = psum - (sum1*sum2/len(si))
den = sqrt((sum1sq - pow(sum1,2)/len(si)) * (sum2sq - pow(sum2,2)/len(si)))
del smallcustdict
del si
del sum1
del sum2
del sum1sq
del sum2sq
del psum
if den == 0:
return 0
return num/den
通过 sim_pearson 方法的每个循环都会无限地增加 python.exe 的内存占用。我尝试使用“del”方法显式删除局部范围变量。
查看任务管理器,内存以 6-10Mb 的增量增加。设置初始 customerdict 后,占用空间为 137Mb。
有什么想法为什么我这样做内存不足?