我有一个csv文件,我想删除其中的重复行,但它太大,无法放入内存。我找到了一种方法来完成它,但我猜这不是最好的方法。
每行包含15个字段和几百个字符,所有字段都需要确定唯一性。与其比较整行以查找重复项,不如比较hash(row-as-a-string),以节省内存。我设置了一个过滤器,将数据划分成大致相等数量的行(例如一周中的几天),并且每个分区都足够小,以至于该分区的哈希值查找表可以放在内存中。我为每个分区传递一次文件,检查唯一的行并将它们写入第二个文件(伪代码):import csv
headers={'DayOfWeek':None, 'a':None, 'b':None}
outs=csv.DictWriter(open('c:\dedupedFile.csv','wb')
days=['Mon','Tue','Wed','Thu','Fri','Sat','Sun']
outs.writerows(headers)
for day in days:
htable={}
ins=csv.DictReader(open('c:\bigfile.csv','rb'),headers)
for line in ins:
hvalue=hash(reduce(lambda x,y:x+y,line.itervalues()))
if line['DayOfWeek']==day:
if hvalue in htable:
pass
else:
htable[hvalue]=None
outs.writerow(line)
我想加快速度的一个方法是找到一个更好的过滤器来减少必要的通过次数。假设行的长度是均匀分布的,可以代替for day in days:
以及if line['DayOfWeek']==day:
我们有for i in range(n):
以及if len(reduce(lambda x,y:x+y,line.itervalues())%n)==i:
在内存允许的范围内。但这仍然使用同样的方法。
Wayne Werner在下面提供了一个很好的实用解决方案;我很好奇是否有更好/更快/更简单的方法从算法的角度来实现这一点。
p.S.I仅限于Python2.5。