Хороший алгоритм сжатия без потерь для небольшого объема данных?
Я ищу хороший алгоритм сжатия без потерь, который может очень быстро сжимать / распаковывать небольшие объемы данных, такие как 256 операций с плавающей точкой, которые находятся между 0 и 1. Я знаю RLE, но, возможно, есть что-то лучше.
Фоном является то, что я работаю с объемными данными (например, 384³ с плавающей запятой) с помощью CUDA, и вместо явного хранения объема я хочу разделить его на блоки размером 8x8x4 и сохранить сжатые блоки. Ядра CUDA (каждый блок, состоящий из потоков 8x8x4) распаковывает соответствующий блок, работает с ним и сжимает его снова.
Я благодарен за любые предложения!
2 ответа
Хороший алгоритм без потерь зависит от типа float
количество у вас есть. За float
от 0 до 1, вы можете иметь почти одинаковое значение в подвал. Вы знаете float
это знак, мантисса и показатель степени. Если они все>0, знак всегда один и тот же, не храните его.
Упаковка показателей вместе может быть хорошей; таким образом, вы должны хранить мантиссу только после.
Возможно, вы сможете отсортировать числа, а затем сохранить их как положение и разницу. Вы можете упаковать их в столько битов, сколько вам нужно. Разница может быть закодирована как дробь, где вы храните только знаменатель.