2016-08-04 10 views
1

В настоящее время я разрабатываю систему обновления OTA/FOTA, которая должна запускаться во встроенном устройстве с ARM CORTEX M0 +. Моя основная проблема - нехватка места FLASH и пропускная способность сети с низкой пропускной способностью, поэтому дельта-патчи должны быть меньше, тем лучше.bsdiff без сжатия генерирует большие файлы дельта-патчей

Чтобы получить этот результат, я провел некоторое исследование и нашел несколько алгоритмов и инструментов двоичного типа, таких как bsdiff, xdelta или courgette. Моя проблема со всеми из них был размер, потому что мне нужно иметь очень небольшое собранное приложение для запуска, поэтому я получил bsdiff автономную версию (на самом деле они были 2 версии: bsdiff автономные и minibsdiff):

https://github.com/Cheedoong/bsdiff

https://github.com/thoughtpolice/minibsdiff

Первый до сих пор использует bzip2, но является автономным и наиболее подходит для встраиваемых систем, но я хотел бы проверить 2 вещи:

  1. Как размер несжатой дельта. Поэтому я попытался удалить всю логику bzip2, получив это. Я был очень удивлен, когда заметил, что размер дельты был похож на размер полного исходного файла, поэтому я подпрыгнул во второй источник - мини-диск.

  2. Minibsdiff - это bsdiff, но без какого-либо сжатия вообще, позволяя вам использовать любое сжатие, которое вы хотите. Это помогло мне также проверить, что я не ошибаюсь и что созданный несжатый дельта-патч был того же размера (или немного больше, потому что заголовок и другие, как я полагаю), чем исходный файл, который я хотел установить.

Итак ... Что здесь происходит? Я читал немного по-разному, что очень похожие файлы генерируют большие патчи, но ... во время тестов я использовал файлы размером 8 КБ, получение несжатых патчей размером 8 КБ не является решением, потому что тогда, возможно, лучше всего сжать файл и заменить старый один за новый. Я чувствую, что что-то упускаю.

Любая идея будет очень оценена.

Спасибо всем.

С уважением,

Iván.

+0

Не знаете, каков ваш реальный вопрос. Вы уже описали «что здесь происходит». Но если вы различаете, вам нужно слить цель с фактическим содержимым перед миганием. В любом случае, без дальнейших подробностей трудно дать полезный ответ. Возможно, вам придется сначала подумать немного дольше. – Olaf

+0

Hello Olaf. Мой вопрос в том, почему это происходит, потому что я притворяюсь, что получаю небольшие дельта, а не те, которые имеют тот же размер, что и исходный файл. Я пытаюсь изучить сортировку суффикса, которую реализует bsdiff, потому что, возможно, не подходит для файлов размером 250 КБ или меньше. И да, если я diff, я должен объединиться, но файл diff является огромным и должен быть небольшим, по крайней мере, меньшим, чем оригинал. Если я не пойду дальше, это потому, что я притворяюсь, что не разрабатываю свой собственный алгоритм, а используя тот, который уже используется. Спасибо, в любом случае. – Fulgor3

+0

Существуют различные способы кодирования различий между файлами. У каждого есть свое приложение. Все зависит от того, что вы ожидаете. Если ваше ожидание не заполнено, вы можете сдуть концепцию. На это нет простого ответа, и вопрос - даже после того, как вся информация будет предоставлена ​​- будет слишком широкой. Сделайте несколько тестов, посмотрите файлы, возможно, определите свой собственный формат/инструменты. Если вы не можете понять и/или не испытываете недостатка в опыте, нанимайте консультанта, и вам нечего стыдиться. В любом случае, переполнение стека не является консультационным сайтом. – Olaf

ответ

1

Если вы вычисляете diff между двумя изображениями с сжатым диском, любая небольшая разница, близкая к началу изображения, приведет к тому, что изображения будут почти полностью разными, создавая длинный diff.

Вы можете вычислить разницу между несжатыми версиями и сжать это для передачи, но для встроенной подпрограммы потребуется достаточное количество ОЗУ для объединения diff в несжатую копию флэш-изображения и повторное сжатие для мигания.

+0

Здравствуйте. Я вычисляю разницу между двумя несжатыми изображениями, потому что я хотел протестировать сначала, не сжимая дельта. Позже я сравнил дельта с помощью блокнота ++ и HexDif, и они не совсем разные, поэтому я был очень удивлен, заметив, что патч был того же размера, что и исходный файл. Другой вопрос будет, если я могу применить патч (просто примените, потому что генерация будет выполняться на настольном ПК) по частям во встроенной памяти с 32 КБ. С наилучшими пожеланиями – Fulgor3

+0

Можете ли вы попробовать и сжать файлы изображений? Если сжатый размер близок к несжатому размеру, это означает, что изображения уже сжаты. вычисление дельта между сжатыми файлами обычно приводит к большому файлу. – chqrlie

+0

Привет, chqrlie. Я пробовал это раньше, и нет, они еще не были сжаты. 8KB (как и исходный размер файла) несжатый патч, а 1.8KB сжатый патч - это то, что я получаю, поэтому кажется, что полезно только сжатие :(Может быть, в проекте minibsdiff пропустили что-то, но у меня были аналогичные результаты модификации bsdiff standalone (без версии bszip2 в usr/bin). Спасибо за ваши идеи !!! .. Вы когда-нибудь реализовали один из этих алгоритмов двоичного разложения с успешным результатом? Мне просто интересно. – Fulgor3

2

Я сделал некоторые выводы, чтобы узнать больше о bsdiff и о том, как он сортирует суффиксы. Кажется, что он добавляет нули между местоположениями, поэтому он увеличивает размер патча, но нули легко сжимаются, и именно поэтому bsdiff эффективен. Поэтому, если я хочу реализовать это в системе с очень небольшой доступной памятью, было бы целесообразно использовать другой алгоритм сжатия, например lzw, например, и изменить патчер для исправления (записать во FLASH fw) в блоках, поскольку я я декомпрессию блоков, потому что я не могу обрабатывать ARM CORTEX M0 + большой файл (32 КБ оперативной памяти и 8 или 16 КБ ROM для сжатого патча).

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

Спасибо всем.

Iván.