El tamaño de repository SVN inexplicable aumenta desde pequeñas diferencias hasta files grandes

No puedo entender por qué las pequeñas diferencias con los files grandes están causando que mi repository de subversión crezca tanto.

Tengo un file zip de los contenidos de una database utilizada por algunas testings. Quiero almacenar cada nueva versión de los datos de testing en nuestro repository de subversión.

He hecho algunos experimentos, comprobando las últimas versiones de data.zip y mirando qué pasa con el tamaño del repository. La información no comprimida es de aproximadamente 150 MB, comprimida y comprimida, es ~ 50 MB. Cada nueva versión del file data.zip registrado en el repository aumenta el tamaño del repository en aproximadamente 50 MB. Creo que solo debería boost por la cantidad de un delta, que espero sea mucho menor.

Subversion usa xdelta para almacenar datos de diferencia comprimidos. Mi bash de confirmar que SVN podría ser mejor fue download xdelta y verificar que no haya mucha diferencia entre dos versiones. En efecto

xdelta3.0z.x86-64.exe -e -s v1_path\data.zip v2_path\data.zip v1v2_delta.file 

produjo un file v1v2_delta.file que fue de aproximadamente 3 MB.

He buscado en el repository SVN en [myrepo] \ db \ revs y puedo ver files grandes para cada nueva revisión

 02/08/2011 11:12 57,853,082 4189 02/08/2011 11:40 51,713,289 4190 02/08/2011 11:46 52,286,060 4191 

(El 4189, 4190 y 4191 son los nombres de los files).

Incluso intenté comprimir el data.zip sin compression. Esto no hizo una diferencia en lo que SVN almacena: por lo que parece, supongo que está almacenando una copy comprimida de todo el data.zip para cada revisión, no solo la primera. Estoy ejecutando SVN 1.6 con un server FSFS.

Hay varias otras buenas respuestas de stackoverflow sobre la ejecución de binarys y cómo SVN almacena deltas, por ejemplo, el performance de SVN después de muchas revisiones . Pero no puedo ver por qué los deltas no se almacenan en el caso anterior, es decir. si xdelta puede get un pequeño diff funcionando independientemente, seguramente SVN también puede – ¿o está eligiendo no hacerlo ?!

Editar: También he probado files tar (sin comprimir), de nuevo SVN no los almacena de manera eficiente. También encontré que tenemos un file zip del mismo formatting de datos (aunque mucho más pequeño) en un repository diferente donde SVN acaba de almacenar diffs .

Así que la versión resumida de esta pregunta es: SVN puede almacenar de manera eficiente files binarys, por ejemplo, 10 files CAD ligeramente diferentes tienen solo 1,2 veces el tamaño de 1 . SVN incluso puede ser eficiente en el uso del espacio con files zip comprimidos a veces. Pero, evidentemente, no siempre es eficiente desde el punto de vista espacial con files binarys, ¿bajo qué condiciones es este el caso?

Resumen

Subversion a veces será peor que xdelta standalone debido a la cantidad de memory que se le da a la compression. Este es un comportamiento de subversión que no se puede cambiar actualmente, a partir de la versión 1.6.

Detalles

Pregunté en la list de correo de subversión por qué los files del depósito de subversión parecían ser más grandes de lo que deberían ser .

La conclusión es que xdelta puede producir un delta más pequeño si le das más memory .

Lea en este hilo otro ejemplo de otra persona que tuvo el mismo problema .

Con crédito y gracias a varias personas en las lists de correo de subversión recientemente y hace cuatro años para esto.

También teniendo este problema?

Si está parsing el uso del disco por el repository de subversión, comprenda skip deltas y use este truco DELTA de grep para descubrir la base que se usa para el delta.

Y suponiendo, como yo, que realmente desea almacenar files binarys en el repository, aquí tengo mi conjetura sobre algunas soluciones (ninguna de ellas es muy fácil):

  1. Modifique el código fuente de subversión y cree el suyo con la window de memory xdelta configurada para ser más grande
  2. ¿Eres dueño de xdelta-ing? Comtesting los deltas en el control de código fuente y ten un process de locura para rebuild
  3. Migrar a Git – está obligado a tener una mejor compression (especulación salvaje)

Creo que la compression cambiará completamente la composition del file binary, por lo tanto, svn tendrá que almacenar enormes deltas. Incluso cambiar unos pocos caracteres del contenido de un file comprimido puede cambiarlo drásticamente.

El almacenamiento de files binarys en el control de código fuente es generalmente una mala idea y creo que deberías search una alternativa.

El contenido binary de los files comprimidos puede cambiar drásticamente cuando se agregan o modifican files en un file comprimido. Se cree que pueden ocurrir cambios en elementos particulares del file y no ocurren cambios significativos en áreas extensas del file comprimido. Sin embargo, es una cuestión de "suerte" que este sea el caso en casos normales (por supuesto, no hay mucha suerte en esto, pero es un poco complejo planearlo).

Esto es bastante normal en los algorithms de encoding de entropía, como Huffman (por nombrar el más simple), ya que las frecuencias de los símbolos cambian cuando se agregan o modifican los files. Si esto ocurre al comienzo del contenido del file, puede afectar gravemente todo el contenido del file después del cambio.

¿Utilizaste el respaldo del sistema de files fsfs? Según recuerdo, almacena una copy nueva cada vez (aunque puede estar comprimida). ¿Por qué esperas que SVN almacene diffs de files binarys? SVN es un sistema de control de código fuente (es decir, text), no un sistema de control binary general (aunque no funciona tan mal como podría con el almacenamiento de binarys).

    Intereting Posts