Tengo un archivo csv del que quiero eliminar filas duplicadas, pero es demasiado grande para caber en la memoria. Encontré una manera de hacerlo, pero creo que no es la mejor manera.Eliminar filas duplicadas de un archivo grande en Python
Cada fila contiene 15 campos y varios cientos de caracteres, y todos los campos son necesarios para determinar la exclusividad. En lugar de comparar toda la fila para encontrar un duplicado, estoy comparando hash(row-as-a-string)
en un intento de ahorrar memoria. Establecí un filtro que divide los datos en una cantidad aproximadamente igual de filas (por ejemplo, días de la semana) y cada partición es lo suficientemente pequeña como para que una tabla de búsqueda de valores hash para esa partición se ajuste a la memoria. Paso por el archivo una vez para cada partición, la comprobación de filas únicas y escribirlos a un segundo archivo (pseudo código):
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)
Una forma pensaba para acelerar este proceso es mediante la búsqueda de un mejor filtro para reducir el número de pases necesarios. Suponiendo que la longitud de las filas se distribuye de manera uniforme, tal vez en lugar de
for day in days:
y
if line['DayOfWeek']==day:
tenemos
for i in range(n):
y
if len(reduce(lambda x,y:x+y,line.itervalues())%n)==i:
donde 'n' como pequeño como la memoria lo permita. Pero esto sigue usando el mismo método.
Wayne Werner proporcionó una buena solución práctica a continuación; Tenía curiosidad de si había una forma mejor/más rápida/más simple de hacer esto desde la perspectiva del algoritmo.
P.S. Estoy limitado a Python 2.5.
Las filas de salida deben estar en el mismo orden que en el archivo de entrada ? ¿Espera muchas repeticiones o el tamaño del archivo de salida se mantiene más o menos en el mismo orden de magnitud que el del archivo de entrada (o no es predecible)? – rbp
El orden de las filas en el archivo de salida no es importante. Para este caso específico, hay relativamente pocos duplicados. ¿Crees que el número de duplicados tiene relación en el caso general? – JonC
Podría ser que, por ejemplo, las filas únicas pudieran caber en la memoria (aunque el archivo completo, con el duplicado, no lo haría). Tengo que irme por un tiempo, pero haré una sugerencia más adelante. – rbp