2011-06-07 23 views
19

A menudo trabajamos en un proyecto en el que se nos ha entregado un gran conjunto de datos (por ejemplo, un puñado de archivos de 1 GB cada uno) y estamos escribiendo código para analizarlo.Git + un gran conjunto de datos?

Todo el código de análisis está en Git, por lo que todos pueden verificar los cambios dentro y fuera de nuestro repositorio central. Pero, ¿qué hacer con los conjuntos de datos con los que el código está trabajando?

Quiero que los datos en el repositorio:

  • Cuando los usuarios primer clon del repositorio, los datos deben venir con.
  • Los datos no son 100% de solo lectura; de vez en cuando se corrige un punto de datos o se produce un cambio menor de formato. Si se producen cambios menores en los datos, se debe notificar a los usuarios en la próxima salida.

Sin embargo, no quiero que los datos en el repositorio git:

  • git clonación de una copia de repuesto (así que tengo dos versiones en mi directorio personal) se tire unos cuantos GB de datos I ya tengo. Prefiero tenerlo en una ubicación fija [establecer una regla de que los datos deben estar en ~/datos] o agregar enlaces según sea necesario.
  • Con los datos en el repositorio, copiar en un disco USB puede ser imposible, lo cual es molesto cuando solo estoy trabajando en cien líneas de código.
  • Si se repara un punto de datos erróneo, nunca volveré a mirar la versión errónea. Los cambios en el conjunto de datos se pueden rastrear en un archivo de texto sin formato o por la persona que proporcionó los datos (o simplemente no en absoluto).

Parece que necesito una configuración con un repositorio principal para el código y un repositorio auxiliar de datos. ¿Alguna sugerencia o truco para implementar esto con elegancia, ya sea dentro de git o en POSIX en general? Todo lo que he pensado es, de una manera u otra, un error.

Respuesta

14

utilice los submódulos para aislar sus archivos gigantes de su código fuente. Más sobre esto aquí:

http://git-scm.com/book/en/v2/Git-Tools-Submodules

Los ejemplos hablan de bibliotecas, pero esto funciona para grandes cosas hinchados como muestras de datos para las pruebas, imágenes, películas, etc.

Usted debe ser capaz de volar, mientras desarrollando, haciendo una pausa aquí y allá si necesita ver nuevas versiones de datos gigantes.

A veces ni siquiera vale la pena realizar un seguimiento de los cambios en tales cosas.

Para resolver sus problemas con obtener más clones de los datos: Si su implementación de git admite enlaces duros en su sistema operativo, esto debería ser muy fácil.

La naturaleza de su conjunto de datos gigante también está en juego. Si cambias algo de eso, ¿estás cambiando blobs gigantes o algunas filas en un conjunto de millones? Esto debería determinar cuán efectivo será el VCS al jugar un mecanismo de notificación para él.

Espero que esto ayude.

+2

El enlace está desactualizado. Creo que debería ser http://git-scm.com/book/en/v2/Git-Tools-Submodules ahora. –

+0

hecho. Gracias por comentar –

+0

Argumentaría que mantener grandes conjuntos de datos, particularmente si no cambian, en git es excesivo. Mantener los conjuntos de datos fuera de git, y usar una secuencia de comandos simple para copiar o wget o ftp los datos de la fuente sería óptimo. – cpbills

9

Esto suena como la ocasión perfecta para probar git-annex:

git-anexo permite gestión de los archivos con git, sin comprobar el contenido del archivo en Git. Si bien esto puede parecer paradójico, es útil cuando se trata de archivos más grandes que los que puede manejar , ya sea debido a limitaciones en la memoria, el tiempo de la suma de comprobación o el espacio en disco.

+0

+1 no lo he visto antes de – sehe

+1

Thx para la punta. Hay muchas dependencias, por lo que no podré usar esto en el trabajo, donde cada artículo nuevo es una gran cantidad de papeleo, pero ciertamente voy a probar esto para otras cosas. –

1

Git BUP afirma hacer un buen trabajo con la copia de seguridad incremental de archivos de gran tamaño.

Creo que BUP supone un repositorio por separado para hacer es trabajo por lo que terminaría usando submódulos de todos modos. Sin embargo, si desea una buena reducción del ancho de banda, esto es lo que

1

Como alternativa, los datos podrían residir en una carpeta sin seguimiento (por git) que se sincroniza mediante un servicio p2p. Usamos esta solución para un conjunto de datos de varias decenas de GB y funciona muy bien.

  • El conjunto de datos se comparte directamente entre los pares.
  • Según el software p2p, las versiones anteriores se pueden conservar y restaurar.
  • El conjunto de datos estará actualizado automáticamente en caso de cambios.

syncthing es el software que utilizamos.

Cuestiones relacionadas