Dos archivos de texto cada uno con entre 7 y 9 millones de registros de datos y no sabía si parte de los registros de A estaban en B. Quería saber los registros que estaban en A y no estaban en B para sumarlos a B.
Comprobarlo en mysql me resultaba imposible por lo que tardaba.
Probé desde la consola de linux:
grep -Fvf archivo1.txt archivo2.txt>/home/usuario/noestan.txt
y se quedaba sin memoria.
Probé este archivo de linux haciendo que el archivo1 tuviera sólo 1000 líneas y así pronosticar cuanto tardaría con los 7 millones de líneas:
El resultado fue que tardaría más de 400 días...
file1=open("C:\\Users\\carlos\\Documents\\de\\archivo1.txt","r")
file2=open("C:\\Users\\carlos\\Documents\\de\\archivo2.txt","r")
file3=open("C:\\Users\\carlos\\Documents\\de\\noestan.txt","w")
lines1=file1.readlines()
lines2=file2.readlines()
encontrado=0
for line1 in lines1:
for line2 in lines2:
if line1==line2:
encontrado2=1
if encontrado2==0:
print(line1)
file3.write(line1)
encontrado2=0
# Cerrar archivos abiertos
file1.close()
file2.close()
file3.close()
Así que probé con sets:
import timestart = time.time()file1=open("C:\\Users\\carlos\\Documents\\de\\archivo1.txt","r")file2=open("C:\\Users\\carlos\\Documents\\de\\archivo2.txt","r")file3=open("C:\\Users\\carlos\\Documents\\de\\noestan.txt","w")data2 = set(file2.read().splitlines())data1 = set(file1.read().splitlines())for list in data1:if list not in data2:file3.write(list)file3.write('\n')# Close opend filefile1.close()file2.close()file3.close()end = time.time()print(end - start)
Y el resultado fue que tardó 12 segundos. Lo peor fue que todos los registros de A estaban en B por lo que me servirá para otra vez pero no para esta. Metí algún resultado falso en A para ver que realmente funcionaba y si.
No hay comentarios:
Publicar un comentario