Git + большой набор данных?
Мы часто работаем над проектом, в котором нам передают большой набор данных (скажем, несколько файлов по 1 ГБ каждый), и пишем код для его анализа.
Весь код анализа находится в Git, поэтому каждый может проверить изменения в нашем центральном репозитории и из него. Но что делать с наборами данных, с которыми работает код?
Мне нужны данные в репозитории:
- когда пользователи впервые клонируют хранилище, данные должны поступать вместе с ним.
- данные не является 100% доступным только для чтения; время от времени точка данных корректируется или происходит незначительное изменение форматирования. Если с данными происходят незначительные изменения, пользователи должны быть уведомлены об этом при следующем оформлении заказа.
Однако мне не нужны данные в репозитории git:
- клонирование git запасной копии (поэтому у меня есть две версии в моем домашнем каталоге) вытянет несколько ГБ данных, которые у меня уже есть. Я бы предпочел либо иметь его в фиксированном месте [установить правило, что данные должны быть в ~ / data], либо добавить ссылки как необходимый.
- с данными в хранилище копирование на флешку может быть невозможно, что раздражает, когда я просто работаю над сотней строк кода.
- Если ошибочная точка данных исправлена,я никогда больше не буду смотреть на ошибочную версию. Изменения в наборе данных могут быть отслежены в обычном текстовом файле или человеком, который предоставил данные (или просто не совсем).
Похоже, что мне нужна настройка с основным репозиторием для кода и вспомогательным репозиторием для данные. Есть ли какие-либо предложения или приемы для изящной реализации этого, либо в git, либо в POSIX в целом? Все, о чем я думал, так или иначе Клудж.
4 ответа:
Используйте подмодули, чтобы изолировать гигантские файлы от исходного кода. Подробнее об этом здесь:
Http://git-scm.com/book/en/v2/Git-Tools-Submodules
Примеры говорят о библиотеках, но это работает для больших раздутых вещей, таких как образцы данных для тестирования, изображения, фильмы и т. д.
Вы должны быть в состоянии летать во время разработки, только останавливаясь здесь и там, если вам нужно посмотреть на новые версии гигантских данных.
Иногда это даже не стоит отслеживать изменения в таких вещах.
Чтобы решить ваши проблемы с получением большего количества клонов данных: Если ваша реализация git поддерживает жесткие ссылки на вашей ОС,это должно быть ветерком.
Природа вашего гигантского набора данных также находится в игре. Если вы измените некоторые из них, вы изменяете гигантские капли или несколько строк в наборе миллионов? Это должно определить, насколько эффективно VCS будет играть механизм уведомления для него.
Надеюсь, это поможет.
Это звучит как идеальный повод попробовать git-приложение:
Git-приложение позволяет управлять файлами с помощью git, не проверяя содержимое файла в git. Хотя это может показаться парадоксальным, это полезно при работе с файлами большего размера, чем Git может в настоящее время легко обрабатывать, будь то из-за ограничений в памяти, времени контрольной суммы или дискового пространства.
Git BUP утверждает, что хорошо справляется с пошаговым резервным копированием больших файлов.
Я думаю, что BUP предполагает отдельный репозиторий для выполнения это работа, так что вы все равно будете использовать подмодули. Однако, если вы хотите хорошее сокращение полосы пропускания, это то, что нужно
В качестве альтернативы, данные могут находиться в папке untracked (by git), которая синхронизируется службой p2p. Мы используем это решение для набора данных в несколько десятков ГБ, и оно работает довольно хорошо.
- набор данных совместно используется непосредственно между одноранговыми узлами.
- в зависимости от программного обеспечения p2p более старые версии могут быть сохранены и восстановлены.
- набор данных будет автоматически обновляться в случае изменений.
Syncthing - это программное обеспечение, которое мы используем.