2012-08-06 15 views
7

Tengo dos archivos de texto grandes, cada uno con más de 10 millones de líneas. ¿Cómo puedo comparar los archivos y obtener diferentes líneas en los archivos usando C++?Comparación de archivos enormes usando C++

He intentado cargar un archivo en la memoria y ordené la memoria y usé la lógica del árbol binario para comparar los archivos. Se comparó y me dio el resultado en 20 segundos. Pero está consumiendo más memoria. (El archivo de texto tiene alrededor de 500 MB).

Quiero comparar dos archivos sin consumir más memoria, un buen rendimiento y tener efectos mínimos en el disco duro.

+7

El primer paso es elegir un idioma. Las soluciones serán diferentes para C y C++. – juanchopanza

+6

¿Una herramienta de diferencias no cumple con sus requisitos? Más fácil que reinventar la rueda. – user7116

+2

Deje que el lenguaje sea CPP –

Respuesta

4

puede usar un método de dos pasos.

primer paso, lee archivos pero solo almacena el valor hash y el inicio de línea pos de líneas, luego puede comparar archivos basados ​​en valores hash, solo lee las líneas nuevamente para comparar en el segundo pase cuando dos líneas tienen el mismo valor de hash esto ahorrará el consumo de memoria y el tiempo de la CPU, con una penalización de bit para leer algunas líneas dos veces.

+0

Sugería lo mismo, pero luego pensé que cuando los hash son ** iguales ** (casi nunca), podría ser necesario buscar el texto para asegurarnos de que se comparen. Por lo tanto, esta estrategia ingenua tal vez no sea muy efectiva. OTH diff debería usar algo similar. – CapelliC

+0

Si no te importa si te equivocas una o dos veces antes de que el universo termine, simplemente usa el código hash de 128 bits sobre las líneas fuente. La probabilidad de obtener una mala comparación para 10 millones de líneas es (1-2^(- 128)) * 10^7 ~~ 1-2^(- 103). Parece lo suficientemente seguro. –

+0

@IraBaxter Bueno, en realidad me importa;) y creo que a mucha gente le importa también. – FrostNovaZzz

Cuestiones relacionadas