Tengo una pregunta general sobre su opinión sobre mi "técnica".¿Cómo comparar archivos de texto grandes?
Hay 2 archivos de texto (file_1
y file_2
) que deben compararse entre sí. Ambos son muy grandes (3-4 gigabytes, de 30,000,000 a 45,000,000 líneas cada uno). Mi idea es leer varias líneas (tantas como sea posible) de file_1
en la memoria, luego compararlas con todas las líneas de file_2
. Si hay una coincidencia, las líneas de ambos archivos que coincidan se escribirán en un nuevo archivo. Luego continúe con las siguientes 1000 líneas de file_1
y también compare las de todas las líneas de file_2
hasta que pasé por file_1
por completo.
Pero esto realmente suena muy, muy lento y complicado para mí. ¿Puedes pensar en algún otro método para comparar esos dos archivos?
¿Cuánto tiempo cree que podría tomar la comparación? Para mi programa, el tiempo no importa tanto. No tengo experiencia en trabajar con archivos tan grandes, por lo tanto, no tengo idea de cuánto puede durar esto. No debería tomar más de un día sin embargo. ;-) Pero me temo que mi técnica podría llevar una eternidad ...
Una pregunta que me vino a la mente: ¿cuántas líneas leerías en la memoria? ¿El mayor número posible? ¿Hay alguna forma de determinar el número de líneas posibles antes de intentarlo realmente? Quiero leer tantos como sea posible (porque creo que es más rápido) pero me he quedado sin memoria con bastante frecuencia.
Gracias de antemano.
EDIT Creo que tengo que explicar mi problema un poco más.
El propósito no es ver si los dos archivos en general son idénticos (no lo son). Hay algunas líneas en cada archivo que comparten la misma "característica". He aquí un ejemplo: file_1
se ve algo como esto:
mat1 1000 2000 TEXT //this means the range is from 1000 - 2000
mat1 2040 2050 TEXT
mat3 10000 10010 TEXT
mat2 20 500 TEXT
file_2
se parece a esto:
mat3 10009 TEXT
mat3 200 TEXT
mat1 999 TEXT
TEXT
se refiere a los caracteres y dígitos que no son de interés para mí, mat
puede pasar de mat1 - mat50
y no están en orden; también puede haber 1000x mat2
(pero los números en la siguiente columna son diferentes). Necesito encontrar las líneas de ajuste de una manera que: matX sea la misma en ambas líneas comparadas y el número mencionado en file_2
se ajuste al rango mencionado en file_1
. Entonces, en mi ejemplo, encontraría una coincidencia: la línea 3 de file_1
y la línea 1 de file_2
(porque ambas son mat3 y 10009 están entre 10000 y 10010). ¡Espero que esto lo aclare!
Así que mi pregunta es: ¿cómo buscarías las líneas correspondientes?
Sí, uso Java como mi lenguaje de programación.
EDIT Ahora dividí primero los archivos de gran tamaño para no tener problemas con la falta de memoria. También creo que es más rápido comparar (muchos) archivos más pequeños entre ellos que esos dos archivos enormes. Después de eso puedo compararlos de la manera que mencioné arriba. Puede que no sea la manera perfecta, pero todavía estoy aprendiendo ;-) No obstante, todos sus enfoques fueron muy útiles para mí, ¡gracias por sus respuestas!
Has etiquetado la pregunta con 'java', ¿significa que solo quieres hacerlo en Java? –
no sé si eso puede ayudarle a http://stackoverflow.com/questions/964332/java-large-files-disk-io-performance –
Suena como un buen caso de uso para la asignación de memoria (y defragmente sus archivos primero), pero no sé si Java ofrece eso. –