Двоичное дельта-хранилище

Я ищу решение для хранения дельта-файлов в двоичном формате для версии больших двоичных файлов (файлы цифровых аудио рабочих станций)

При работе с файлами DAW большинство изменений, особенно ближе к концу микса, очень малы по сравнению с огромным объемом данных, используемых для хранения необработанных данных (волн).

Было бы здорово иметь систему управления версиями для наших файлов DAW, позволяющую нам откатываться к более старым версиям.

Система сохранит только разницу между бинарными файлами (diff) каждой версии. Это даст нам список инструкций по переходу с текущей версии на предыдущую без сохранения полного файла для каждой отдельной версии.

Существуют ли современные системы управления версиями, которые делают это? Я читал, что SVN использует двоичный diff для экономии места в репо... Но я также читал, что на самом деле он не делает этого для двоичных файлов, только для текстовых файлов... Не уверен. Любые идеи?

Мой план действий на данный момент состоит в том, чтобы продолжить исследование ранее существовавших инструментов, и, если таковых не существует, освоиться с чтением двоичных данных c/c++ и созданием инструмента самостоятельно.


person Colton Phillips    schedule 29.08.2011    source источник
comment
Пожалуйста, не повторяйте один и тот же вопрос на нашем сайте. Спасибо.   -  person Kev    schedule 30.08.2011
comment
Повторный вопрос был случайным из-за (я думаю) ошибки. Я попытался нажать добавить вопрос один раз, но выдало ошибку, говорящую, что мне нужно подождать 20 минут, прежде чем отправить. После этого я снова отправил заявку, чтобы увидеть два вопроса, а не один...   -  person Colton Phillips    schedule 30.08.2011


Ответы (4)


Я не могу комментировать проблемы с надежностью или подключением, которые могут возникнуть при фиксации большого файла по сети (в одной из упомянутых публикаций намекались на проблемы). Но вот немного эмпирических данных, которые могут оказаться полезными (или нет).

Сегодня я провел несколько тестов, изучая время поиска на диске, и поэтому у меня под рукой был достаточно хороший тестовый пример. Я нашел ваш вопрос интересным, поэтому я провел быстрый тест с файлами, которые я использую/модифицирую. Я создал локальный репозиторий Subversion и добавил в него два бинарных файла (размеры показаны ниже), а затем пару раз зафиксировал файлы после того, как в них были внесены изменения. Двоичный файл меньшего размера (0,85 ГБ) просто каждый раз добавлял данные в конец. Файл большего размера (2,2 ГБ) содержит данные, представляющие b-деревья, состоящие из «случайных» целочисленных данных. Обновления этого файла между фиксациями включали добавление примерно 4000 новых случайных значений, так что измененные узлы были бы несколько равномерно распределены по всему файлу.

Вот исходные размеры файлов, а также размер/количество всех файлов в локальном репозитории Subversion после коммита:

file1    851,271,675  
file2  2,205,798,400 

1,892,512,437 bytes in 32 files and 32 dirs

После второго коммита:

file1    851,287,155  
file2  2,207,569,920  

1,894,211,472 bytes in 34 files and 32 dirs

После третьего коммита:

file1    851,308,845  
file2  2,210,174,976  

1,897,510,389 bytes in 36 files and 32 dirs

Коммиты были несколько длинными. Я не обращал особого внимания, потому что занимался другой работой, но думаю, что каждая из них занимала минут 10. Проверка конкретной версии заняла около 5 минут. Я бы не стал давать рекомендации так или иначе, основываясь на своих результатах. Все, что я могу сказать, это то, что все работало нормально, и ошибок не было. И разница файлов, похоже, работала хорошо (для этих файлов).

person Mark Wilkins    schedule 30.08.2011
comment
Да, это примерно то, что вы ожидаете от двоичной дельты, так что, похоже, она работает довольно хорошо... Хм. Я думаю, мне придется попытаться сделать тот же тест на моих собственных файлах с локальным репо. - person Colton Phillips; 30.08.2011
comment
@Colton: Из любопытства я использовал 7-Zip (утилиту сжатия файлов) с настройками по умолчанию и сжал эти два файла. В результате получился файл размером 1,88 ГБ. Таким образом, сжатие, используемое Subversion в этом случае, также кажется правильным. Вероятно, они оба использовали ZLib. - person Mark Wilkins; 30.08.2011
comment
@Colton: Какое программное обеспечение DAW вы используете? Не то, чтобы это действительно имело значение, но мне любопытно. Я использую Cakewalk (Sonar) и думал, что должен использовать какой-то контроль версий с моими файлами, но на самом деле никогда этого не делал. Этот небольшой тест, который я провел, наводит меня на мысль, что я могу настроить его дома. - person Mark Wilkins; 30.08.2011
comment
Я использую Reason в качестве DAW. Держите меня в курсе, что вы делаете и как это работает :) - person Colton Phillips; 30.08.2011
comment
Я предполагаю, что, поскольку фактическая дельта составляет всего несколько мегабайт, большая часть 10 минут, потраченных на коммит, вероятно, была связана с бинарным diff. - person Colton Phillips; 01.09.2011
comment
Наверное, это правильно. Он должен читать данные репозитория и распаковывать их, читать текущий файл, сравнивать/сопоставлять их, вносить изменения, снова сжимать и т. д. Довольно много всего происходит. - person Mark Wilkins; 01.09.2011
comment
Как вы думаете, сколько примерно времени занимают этапы распаковки и сжатия? Мне кажется, что единственное преимущество моей собственной реализации системы контроля версий дельта-хранилища над svn заключается в том, что она не будет выполнять эти 2 этапа, и мой инструмент, вероятно, будет одноцелевым и немного быстрее, потому что он менее гибкий, чем свн. Теперь вопрос в том, даже если бы это время БЫЛО значительным, стоило ли писать это приложение в любом случае... вероятно, нет... - person Colton Phillips; 01.09.2011
comment
Это также предполагает, что мой алгоритм будет эффективен, как svn, что, вероятно, не будет ... но кто знает. - person Colton Phillips; 01.09.2011
comment
Одна вещь, на которую следует обратить внимание: в зависимости от того, какие именно у вас двоичные данные, subversion может плохо создавать дельты. Мое расследование этого находится в этом вопросе. Кажется, одна ключевая вещь, о которой нужно знать, - это материал пропуска дельт, что означает, что каждая дельта не обязательно рассчитывается относительно непосредственно предшествующей версии файла. - person Jon Stafford; 06.09.2011

Subversion может работать, в зависимости от вашего определения большого. Этот вопрос/ответ говорит, что это работает хорошо, если ваши файлы меньше 1 ГБ.

person Shane Wealti    schedule 29.08.2011

Subversion будет выполнять двоичные изменения в двоичных файлах, а также в текстовых файлах. Subversion просто не может предоставить удобочитаемые дельты для двоичных файлов и не может помочь с конфликтами слияния в двоичных файлах.

person bdonlan    schedule 29.08.2011
comment
Я случайно разместил эту тему дважды... но... в другой моей теме я создал кого-то, кто сказал, что Subversion может работать, в зависимости от вашего определения большого размера. В этом вопросе/ответе говорится, что он работает хорошо, если ваши файлы меньше 1 ГБ. Что является проблемой, так как почти все файлы DAW будут больше, чем ГБ. - person Colton Phillips; 30.08.2011

git сжимает (хотя вам, возможно, придется вызвать git gc вручную), и, похоже, действительно хорошо:

$ 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    .
person phihag    schedule 30.08.2011
comment
Это, вероятно, не удастся, если вы используете git в 32-битной ОС. - person yarun can; 08.12.2013
comment
@yaruncan Можете ли вы пояснить, почему вы считаете, что это не удастся, и почему разрядность ОС должна иметь значение? Я получаю точно такой же вывод в 32-битной системе. - person phihag; 08.12.2013
comment
phihag, 64-битная или 32-битная ОС имеет значение, когда вам нужно много оперативной памяти для таких операций. В основном я говорю о сжатии git с помощью таких вещей, как git repack и git gc. На самом деле эти операции всегда терпят неудачу на моем 32-битном Linux, поэтому мне приходится выполнять их на другом компьютере с 64-битной операционной системой. - person yarun can; 09.12.2013
comment
@yaruncan Я не согласен, разрядность ОС для этого совершенно не имеет значения. То, что вы имеете в виду, - это доступное адресное пространство процессов, а это другой зверь. Если ваш репозиторий действительно большой, некоторые операции могут не работать. Обратите внимание, что этот пример с файлом размером 200 МБ отлично работает, хотя и в 32-битной системе с оперативной памятью менее 1 ГБ. Кроме того, более новые версии git значительно оптимизировали repack и gc. - person phihag; 09.12.2013
comment
git упаковка и сжатие часто не работают независимо от того, какие ограничения пакетов я использую. Я просто предупреждал плакат об опасностях. - person yarun can; 09.12.2013