Almacenamiento Binario Delta

Estoy buscando una solución de almacenamiento binary delta para la versión de files binarys grandes (files de estación de trabajo de audio digital)

Al trabajar con files DAW, la mayoría de los cambios, especialmente cerca del final de la mezcla, son muy pequeños en comparación con la gran cantidad de datos utilizados para almacenar datos en bruto (ondas).

Sería genial tener un sistema de control de versiones para nuestros files DAW, lo que nos permite retroceder a versiones anteriores.

El sistema solo saveá la diferencia entre los files binarys (diff) de cada versión. Esto nos daría una list de instrucciones para cambiar de la versión actual a la versión anterior sin almacenar el file completo para cada versión.

¿Hay algún sistema de control de versiones actual que haga esto? He leído ese SVN usando diferencias binarias para ahorrar espacio en el repository … Pero también he leído que en realidad no hace eso para files binarys solo files de text … No estoy seguro. ¿Algunas ideas?

Mi plan de acción a partir de ahora es continuar la investigación en herramientas preexistentes, y si no existe ninguna, estar cómodo con c / c ++ leyendo datos binarys y creando la herramienta yo mismo.

No puedo comentar sobre la fiabilidad o los problemas de connection que pueden existir al comprometer un file grande en la networking (una publicación referenceda insinuó problemas). Pero aquí hay un poco de datos empíricos que pueden serle útiles (o no).

He estado haciendo algunas testings hoy estudiando los times de búsqueda de disco y, por lo tanto, tenía un caso de testing razonablemente bueno a mano. Encontré su pregunta interesante, así que hice una testing rápida con los files que estoy usando / modificando. Creé un repository local de Subversion y le agregué dos files binarys (los tamaños se muestran a continuación) y luego envié los files un par de veces después de que se le hicieron los cambios. El file binary más pequeño (.85 GB) simplemente tenía datos agregados al final cada vez. El file más grande (2.2GB) contiene datos que representan b-trees que consisten en datos integers "aleatorios". Las actualizaciones de ese file entre confirmaciones implicaron la adición de aproximadamente 4000 nuevos valores aleatorios, por lo que habría modificado los nodos extendidos de manera uniforme a lo largo de todo el file.

Estos son los tamaños de file originales junto con el tamaño / recuento de todos los files en el repository de subversión local después de la confirmación:

file1 851,271,675 file2 2,205,798,400 1,892,512,437 bytes in 32 files and 32 dirs 

Después del segundo compromiso:

 file1 851,287,155 file2 2,207,569,920 1,894,211,472 bytes in 34 files and 32 dirs 

Después del tercer compromiso:

 file1 851,308,845 file2 2,210,174,976 1,897,510,389 bytes in 36 files and 32 dirs 

Los compromisos fueron algo largos. No presté mucha atención porque estaba haciendo otro trabajo, pero creo que cada uno tomó tal vez 10 minutos. Para verificar una revisión específica tomó aproximadamente 5 minutos. No haría una recomendación de una forma u otra en function de mis resultados. Todo lo que puedo decir es que parecía funcionar bien y no se produjeron errores. Y la diferenciación de files parecía funcionar bien (para estos files).

Subversion podría funcionar, dependiendo de su definición de grande. Esta pregunta / respuesta dice que funciona bien siempre y cuando tus files tengan less de 1 GB.

Subversion realizará deltas binarys en files binarys y files de text. Subversion es simplemente incapaz de proporcionar deltas legibles por humanos para files binarys, y no puede ayudar a fusionar conflictos en files binarys.

git comprime (puede necesitar llamar a git gc manualmente) y aparentemente muy bueno:

 $ git init $ dd if=/dev/urandom of=largefile bs=1M count=100 $ git add largefile $ git commit -m 'first commit' [master (root-commit) e474841] first commit 1 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 largefile $ du -sh . 201M . $ for i in $(seq 20); do date >> largefile; git commit -m "$i" -a; git gc; done $ du -sh . 201M .