我有一个csv文件,想要从中删除重复的行,但它太大了无法放入内存。我找到了一种方法来完成这个任务,但我猜想这不是最好的方式。
每行包含15个字段和数百个字符,所有字段都需要用来确定唯一性。为了节省内存,我使用hash(将row转换为字符串)
进行比较,而不是对整行进行比较以查找重复项。我设置了一个过滤器,将数据分成大致相等数量的行(例如按星期几),每个分区的大小足够小,可以在内存中容纳一个哈希值的查找表。我为每个分区遍历一次文件,检查唯一行并将其写入第二个文件(伪代码):
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:
andif line['DayOfWeek']==day:
我们有
for i in range(n):
和
if len(reduce(lambda x,y:x+y,line.itervalues())%n)==i:
尽可能使用内存较小的'n'。但这仍然使用相同的方法。
Wayne Werner在下面提供了一个好的实用解决方案;我很好奇是否有更好/更快/更简单的算法方法来执行此操作。
附:我只能使用Python 2.5。