Как оптимально хранить в бинарном файле сортированные целые числа?

Храню большие наборы 32-битныйх целых чисел, сортированные по возрастанию. Сейчас, не долго думая, просто пишу по 4 байта на каждое. С ростом системы объём файловых данных стал ощутимым, бэкапы в облака стали стоит заметную копейку.

Т.к. единственная задача - последовательное чтение этих целых, то представляю, что можно заметно сократить объём данных, если записывать только первое значение целиком + последовательные инкременты, которые могут умещаться и в 1-2-3 байта.

Вопросы:
  1. наверняка есть известный формат/алгоритм сжатия подходящий для описанной ситуации – какой?
  2. надо ли, и как - заморачиваться на контроль целостности данных?
Upd. Пока оптимальным кажется такой вариант, блоками по 4 инкремента с одним байтом в начале для указания длинн этих инкрементов. Так сохраняется грануляция до целых байтов:

01010101 01010101 01010101 01010101 - начальное значение
10110101                            - b - сколько байт в следующих 4 блоках
                                      (10 11 01 01 = 2, 3, 1, 1)
01010101 01010101                   - inc - инкремент
01010101 01010101 01010101          - inc
01010101                            - inc
01010101                            - inc

                                      Следующий блок из 4 инкрементов:
11011101                            - b - (11 01 11 01 = 3, 1, 3, 1)
01010101 01010101 01010101          - inc
01010101                            - inc
01010101 01010101 01010101          - inc
01010101                            - inc
...


В конце файла блок нулевые длины инкрементов, если те лишние.
  • Вопрос задан
  • 2432 просмотра
Пригласить эксперта
Ответы на вопрос 1
maaGames
@maaGames
Погроммирую программы
Сперва хотел рассказать про хранение WAV файлов в формате PCM, но передумал. Вы собираетесь экономить на печеньках - не правильный подход.
Предлагаю оптимальный вариант + его модификацию.
1. Раз данные пишутся и читаются последовательно, то вам Бог велел использовать потоковое сжатие (это если файл в оперативную память весь не влезает, иначе тупо зиповать можно было бы). Не зная языка программирования не могу подсказать библиотеку. На C++ можно декорировать файловый поток архиватором, чтобы на лету данные паковать. Самому архиватор писать не стоит, лучше поищи готовую реализацию.
2. Так как числа упорядочены, то вы правильно предложили хранить разницу между соседними числами, это обеспечит очень много повторяющихся величин, которые должны отлично сжаться любым архиватором.

Как правило архиваторы считают контрольную сумму кодируемых данных, поэтому дополнительной проверки не должно потребоваться. Если при закачки на/из облака данные повредятся, то при распаковке это должно будет выясниться.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы