Сжатие двойных значений с помощью C

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

Нужно ли мне сначала поместить эти значения double в файл или какой-либо другой формат, а затем выполнить сжатие, или я могу выполнить сжатие непосредственно значений, не помещая их в файлы или какой-либо другой формат.

Во-вторых, если у вас есть какие-либо другие рекомендации, кроме lz4 по сжатию, пожалуйста, поделитесь ими.


person Hamid    schedule 09.01.2015    source источник
comment
То, что вы сжимаете, — это необработанные байты, будь то двойники, текст, аудио или что-то еще — это не имеет большого значения. Различные данные по-разному поддаются сжатию.   -  person dtech    schedule 09.01.2015


Ответы (4)


Вы можете и будете сжимать двойники непосредственно как последовательность байтов, восемь на двойник. Однако вы можете не получить от этого большой выгоды.

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

Что касается компрессоров, то это компромисс между временем и степенью сжатия. Для высокой скорости, но меньшего сжатия подойдет lz4. Для высокого сжатия, но медленнее и с большим объемом памяти, lzma подходит. Для чего-то среднего подойдет zlib.

Независимо от сжатия, вам также необходимо убедиться, что сервер использует один и тот же формат для double. Крайне вероятно, что оба используют формат IEEE 754 для дублирования, что в настоящее время делает почти каждая машина. Однако вам нужно будет проверить порядок байтов представления. Вам может потребоваться изменить порядок байтов каждого восьмибайтового двойника в потоке, если машины имеют разный порядок следования байтов, т. е. один с прямым порядком байтов (например, Intel), а другой с прямым порядком байтов (например, Power PC или ARM).

person Mark Adler    schedule 09.01.2015

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

Алгоритмы сжатия обычно работают с байтовыми массивами или потоками. Но адрес матрицы двойников может быть приведен к char(*) перед передачей в функцию сжатия.

Однако неясно, какую пользу вы получите от сжатия двойников. Алгоритмы сжатия основаны на поиске общих последовательностей байтов и замене их более короткими заполнителями. Двоичные данные могут не иметь избыточности, от которой они зависят.

person Barmar    schedule 09.01.2015

Алгоритмы сжатия обычно работают с последовательностью байтов. Они могут сжиматься из файла в файл или из блока памяти в блок памяти, если хотите. Просто свяжите чью-нибудь библиотеку сжатия (например, zlib или что-то еще) и укажите ее на свой массив двойников - функция сжатия библиотеки, вероятно, принимает аргумент void * и аргумент size_t, которые с радостью примут адрес и размер вашего двойного массива. Он не будет знать и не будет заботиться о том, что в памяти есть двойники.

person Lee Daniel Crocker    schedule 09.01.2015

Различные алгоритмы сжатия, такие как Lempel-Ziv, работают без потерь. Ищите шаблоны в исходных данных и выражайте данные, потенциально, с меньшим количеством байтов. При распаковке восстанавливаются все точные исходные данные.

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

Сжатие числовых данных прекрасно работает с использованием методов без потерь, таких как LZ. Если ваш код требует большего сжатия, рассмотрите простое преобразование в float. Конечно, float обычно имеют меньшую дальность и точность. Если эти эффекты допустимы, это предварительное сжатие с потерями до float уменьшит исходный размер как минимум вдвое и может обеспечить большую степень сжатия.

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

Метод скалывателя включает в себя передачу ваших данных через внешний процесс, такой как compress или uncompress.

person chux - Reinstate Monica    schedule 09.01.2015