Добър алгоритъм за компресия без загуби за малко количество данни?

Търся добър алгоритъм за компресиране без загуби, който може много бързо да компресира/декомпресира малки количества данни, като например 256 плаващи числа, които са между 0 и 1. Знам RLE, но може би има нещо по-добро.

Предисторията е, че работя върху обемни данни (напр. 384³ плаващи) с CUDA и вместо да съхранявам обема изрично, искам да го разделя на блокове с размер 8x8x4 и да съхраня компресираните блокове. CUDA ядрата (всеки блок, състоящ се от 8x8x4 нишки) декомпресират съответния блок, работят върху него и го компресират отново.

Благодарен съм за всякакви предложения!


person yon    schedule 11.02.2014    source източник
comment
384^3 floats е само около 226Mb данни. Защо да си правите труда да компресирате такъв малък набор от данни?   -  person talonmies    schedule 11.02.2014
comment
За да намаля обема на глобалните достъпи до паметта и в идеалния случай бих искал да работя върху нещо като 1024³. Също така, в някои случаи всъщност има 5-6 плаващи точки на воксел, така че би било около ~1Gb данни вече на 384³.   -  person yon    schedule 11.02.2014
comment
Cuda също така поддържа 16-битови стойности с плаваща запетая, ако можете да опаковате половината плаващи числа в 32-битов тип, можете да получите ефективно удвояване на паметта навсякъде за много по-малко изчислителни разходи, отколкото би нанесла схема за компресия без загуби.   -  person talonmies    schedule 11.02.2014


Отговори (2)


Добрият алгоритъм без загуби зависи от вида на float количествата, които имате. За float между 0 и 1 може да имате почти същата подстойност на степента. Знаете, че float е знак, мантиса и степен. Ако всички са >0, знакът е винаги един и същ, не го съхранявайте.

Опаковането на експоненти заедно може да бъде добро; по този начин трябва само да съхранявате мантиси след това.

person Fvirtman    schedule 11.02.2014

Може да успеете да сортирате числата, след което да ги съхраните като позиция и разлика. Можете да ги опаковате заедно в толкова парчета, колкото са ви необходими. Разликата може да бъде кодирана като дроб, където съхранявате само знаменателя.

person Roger Dahl    schedule 12.02.2014