Un problema con su esquema es que cualquier línea repetida tendría un hash repetido; nunca podría identificar cuándo se agregó o eliminó una de esas líneas
Muy buen punto, pero no es un problema. Una línea repetida es un duplicado y todos los duplicados se eliminan en la siguiente etapa de procesamiento. Entonces sí, tienes razón, pero no es un problema.
El enlace "diff" me lleva a una página con una descripción de lo que supongo que es una aplicación. No hay ningún enlace de descarga, no hay código en ningún idioma ... ¿Qué me falta aquí?
Algunos de ustedes han hablado sobre la granularidad a nivel de bytes. Esto no es necesario solo se requiere granularidad a nivel de línea porque si se ha cambiado algo en la línea, toda la línea (registro) debe reprocesarse debido a que cualquier cambio dentro de la línea afecta a toda la línea.
Así que estamos comparando líneas de aproximadamente 1000 caracteres (sin binario), en dos archivos (instantánea de hoy e instantánea de ayer) que son cada uno de aproximadamente 1m de líneas.
Entonces, usando un hash seguro como SHA256 (MD5 tiene colisiones y es lento en comparación) puedo procesar unos 30MB / seg en mi computadora portátil HO. El servidor, por supuesto, masticará mucho más rápido.
Por lo tanto, si el archivo es de 1 GB, entonces hacer todas las acciones toma alrededor de 33 segundos, y leer un archivo de 1 Gb usando la memoria de la página de Windows toma alrededor de 30 segundos. No es horrible
Ahora tenemos dos matrices de hash que representan las líneas en cada archivo. Si los clasificamos, ahora podemos utilizar una búsqueda binaria, por lo que iteramos a través de los nuevos hash de archivos buscando una coincidencia en los hashs de los archivos antiguos. Si no lo encontramos, esa línea se agrega al archivo de cambios.
Tenga en cuenta que el libro de líneas (base de datos heredada) es desconocido en todos los aspectos. No hay garantía de orden de líneas, ubicación de cambios, tipo de cambios.
Las sugerencias de leer página por página son buenas, pero se supone que los dos archivos están en orden hasta el primer cambio. Esto no puede ser asumido. Las líneas (filas) podrían estar en cualquier orden. Además, la elección de un tamaño de bloques arbitrario infringe la granularidad de una línea. Para los fines de esta tarea, las líneas son inmutables.
Desde ese excelente enlace sobre la carga de invrementa: Captura de comparación de archivos: este método también se conoce como el método diferencial de instantáneas. Este método funciona manteniendo las imágenes del antes y el después de los archivos que son de interés para el almacén de datos. Los registros se comparan para encontrar cambios y las claves de registro se comparan para encontrar inserciones y eliminaciones. Esta técnica es la más adecuada en el caso de los sistemas heredados debido a que los desencadenantes generalmente no existen y los registros de transacciones son inexistentes o están en un formato propietario. Dado que la mayoría de las bases de datos heredadas tienen algún mecanismo para volcar datos en archivos, esta técnica crea instantáneas periódicas y luego compara los resultados para generar registros de cambios. Ciertamente, todos los problemas de captura estática están presentes aquí. El desafío de comparar filas completas de información y la identificación y coincidencia de claves introduce una complejidad añadida. Esta técnica es de naturaleza compleja y, por lo general, no es deseable, pero, en algunos casos, puede ser la única solución.
Esto es más relevante aquí: a medida que avanzamos en el ámbito de los almacenes de datos de terabytes, la capacidad de reconstruir el almacén de datos desde cero cada noche seguirá el camino del dinosaurio. El enfoque lógico y eficiente para actualizar el almacén de datos implica alguna forma de estrategia de actualización incremental.
¿Entonces supongo que estoy en el camino correcto? ¿Un índice btree no daría una ventaja?