Стиснення даних з плаваючою комою


26

Чи є інструменти, спеціально розроблені для стиснення наукових даних з плаваючою точкою?

Якщо функція гладка, очевидно, що між числами, що представляють цю функцію, існує велика кореляція, тому дані повинні добре стискатися. Зіпсування / gzipping бінарні дані з плаваючою точкою не дуже добре стискають його. Мені цікаво, чи є метод, спеціально розроблений для стиснення даних з плаваючою точкою.

Вимоги:

  • Чи стиснення без втрат, так і можливість задати мінімальну кількість цифр, яку потрібно зберегти (для деяких додатків doubleможе бути більше, ніж нам потрібно, але floatможе мати недостатню точність).

  • Добре перевірений робочий інструмент (тобто не просто документ, що описує теоретичний метод).

  • Підходить для стиснення 1D числових даних (таких як часовий ряд)

  • Крос-платформа (повинна працювати в Windows)

  • Він повинен бути швидким --- бажано не набагато повільніше, ніж gzip. Я виявив, що якщо у мене числа зберігаються як ASCII, gzipping файлу може прискорити читання та обробку його (оскільки операція може бути пов'язана з введенням / виводом).

Особливо хотілося б почути від людей, які насправді використовували такий інструмент.


Частково це надихнуло існування FLAC , що говорить про те, що спеціалізований метод повинен робити (набагато?) Краще, ніж gzip.
Szabolcs

Я зараз на це дивлюсь.
Szabolcs

Акуратний. Я збираюся дати цьому кружляти.
meawoppl

Відповіді:


22

Спробуйте Blosc . Це в багатьох випадках швидше, ніж мемопія . Подумайте про це на секунду. . . злий.

Це супер стійкий, висококваліфікований, кросплатформенний і виконує функцію чемпіона.


о, вау, це дійсно круто (і нове для мене!)
Арон Ахмадія

Посилання розірвано. Будь-який шанс ви б знали, де зараз?
Алексіс Вілке

1
@AlexisWilke я виправив посилання. Це був перший результат пошуку Google у Blosc.
Doug Lipinski

1
Blosc може бути швидким, але його ступінь стиснення на плавучих масивах - це катастрофа. При найкращому стисненні він пропонує приблизно 98% від початкового розміру. Дякую за пораду в будь-якому випадку.

Стиснення плавучих масивів сильно залежить від вмісту. Я підозрюю, що в бітах, які ви стискаєте, є мало (структурованої) інформації. Крім того, блок 5 років по тому ще залишається в активному режимі!
meawoppl

7

Я отримав хороші результати, використовуючи HDF5 та його фільтр GZIP.

HDF5 також забезпечує фільтр SZIP, який досягає кращих результатів для деяких наборів даних scientifica.

На мій досвід, вибір компресій сильно залежить від виду даних, а порівняльний аналіз, мабуть, єдиний спосіб зробити хороший вибір.

BTW, сторонні фільтри для HDF5 включають BLOSC, BZIP2, LZO, LZF, MAFISC.


Дякую за відповідь! Я не дуже використовував HDF5. Чи правильно, що використання фільтра gzip у форматі HDF5 дасть мені такий же коефіцієнт стиснення, як записування всього числа у плоский двійковий файл та запуск його через gzip? (Ігноруйте можливі зручності / незручності використання HDF5 наразі.) Що стосується SZIP, чи якимось чином він оптимізований для наборів даних з плаваючою комою? (Мені цікаво, і це незрозуміло, якщо проглядати сторінку, яку ви пов’язали.) Сторінка говорить, що головна перевага SZIP - швидкість. GZIP також досить спритний (зазвичай декомпресія gzip для мене незначна).
Саболч

Gzipped плоский двійковий файл, ймовірно, буде меншим, ніж файл HDF5 з фільтром gzip, оскільки HDF5 більше, ніж необроблені дані. Іноді попередня обробка за допомогою фільтра перетасовки може покращити результати gzip. Але ви маєте рацію, переваги справді більш зручні. З HDF5 мені легко змінити фільтр стиснення (спробуйте різні налаштування), а HDF5 забезпечує функцію доступу до підмножини ваших даних (інтервали у часових рядах).
f3lix

1
Якщо ви йдете цим маршрутом, перегляньте pyTables . Це складає лише декілька рядків коду. Ведеться (раніше принаймні) автором Блоска.
meawoppl

6

[1,1]

Залежно від основної функції, ви, можливо, зможете без помилок пристосувати дані до функціональної форми, вимагаючи менше коефіцієнтів для опису функціональної форми, ніж у вас є точка даних (що призводить до стиснення). Результати помилок існують для деяких із цих методів, хоча я не знаю, чи який-небудь з них дасть вам апріорні (або апостеріорні ) межі або оцінки помилки.

Ви також можете переглянути методи, розроблені спеціально для стиснення чисел з плаваючою комою, як FPC та пов'язані з ними алгоритми. Дивіться документи тут , тут , тут , тут і тут , а також веб - сторінки , що містить старий вихідний код тут .


Насправді мене цікавлять готові інструменти, схожі на gzip, які не потребують жодної роботи з мого боку, особливо не розробляючи та не налаштовуючи власний метод. Крім того, було б корисно мати метод, який не вимагає прочитати всю річ у пам'яті перед її декомпресією, оскільки у мене можуть бути дуже великі файли даних, які можна обробляти послідовно (це працює з gzip, але не, якщо я використовую Фур'є перетворіть, якщо я не розрізаю дані на шматки, ще більше ускладнюючи все) Щось, що передбачає, що мій файл даних - це лише серія двійкових пар, було б чудовим.
Саболч

Також це перетворення 1: 1 - це не дуже методи компресії. Вони можуть бути використані для створення даних, з якими алгоритм наївного стиснення може краще працювати, але окремий варіант не є рішенням.
meawoppl

Деякі з цих методів складають математичну основу для алгоритмів стиснення, що використовуються при обробці сигналів, що лежить в основі відповіді. Ці перетворення зазвичай не становлять 1: 1, за винятком особливих обставин.
Джефф Оксберрі

3

HDF5 може використовувати алгоритм "перетасування", де байти для N чисел з плаваючою точкою переставляються так, щоб перші байти з N чисел надходили першими, потім 2-ю тощо. Це призводить до кращих коефіцієнтів стиснення після застосування gzip, оскільки з більшою ймовірністю утворюються довші послідовності того ж значення. Дивіться тут деякі орієнтири .


1

SZ (розроблений Argonne в 2016 році) може бути хорошим вибором.

SZ: Швидкий компресор даних з плаваючою комою з обмеженою помилкою для наукових застосувань https://collab.cels.anl.gov/display/ESR/SZ


Чому, на вашу думку, це може бути вдалим вибором? Які його можливості порівняно з іншими методами стиснення?
Пол

1

Можливі методи, які можна використовувати для стиснення з плаваючою комою:

  • Транспоніруйте 4xN для поплавця та 8xN для подвійного + lz77
    Реалізація: Стиснення з плаваючою точкою в TurboTranspose
    див. Також компресію з втратою, обмежену помилками

  • Прогноз (наприклад, метод кінцевого контексту) + кодування (напр., "Ціле стиснення").
    Реалізація: Стиснення з плаваючою комою в TurboPДля
    включення спеціального стиснення для часових рядів.

  • коли можливо, перетворіть усі числа з плаваючою комою в цілі числа (наприклад, 1,63 -> 163), а потім використовуйте ціле стиснення

  • Ви можете протестувати всі ці методи зі своїми даними, використовуючи інструмент icapp для Linux та Windows.


1

Ми використовували ZFP з HDF5 для даних медичних зображень. Він зроблений для стиснення з плаваючою комою з втратою.

Ми працюємо з ним буквально на всьому світі і зберігаємо (і використовуємо!) Понад 40 ТБ даних. Це досить швидко, щоб зберегти наші дані в режимі реального часу, і ми можемо вказати необхідну точність, тому, хоча формат втрачається, ми не бачимо різниці в наших кінцевих результатах.


0

Якщо функція гладка, очевидно, що між числами, що представляють цю функцію, існує велика кореляція, тому дані повинні добре стискатися.

Можливо, потрібний вам формат повинен зберігати лише компенсації від значення до сусіднього значення.

Крім того, можливо, ви могли б скористатися частотною областю, можливо навіть зберегти ці значення як аудіофайл без втрат, наприклад "flac lossless", оскільки для звуку вам потрібні ті самі властивості.

Однак я буду використовувати інший підхід до спроби відповісти на питання, яке, я сподіваюся, може допомогти. Як ви говорите, це також те, що мінімальна довжина опису для представлення цих даних менша, ніж надання всіх точок даних.

https://en.wikipedia.org/wiki/Minimum_description_length

Ефективно програма, комп'ютерний код, є хорошим прикладом. І якщо ви не заперечуєте, що щось таке, в першу чергу, дані, що працюють, виконуючи виконання, і так само кодоване, ви можете стиснути свої значення з плаваючою комою на щось, як функцію або формулу.

Робити це особливо добре автоматично і в реальній кількості обчислити, це важко. Однак мова Wolfram забезпечує певну функціональність для спроби цього:

https://reference.wolfram.com/language/ref/FindSequenceFunction.html https://reference.wolfram.com/language/ref/FindGeneratingFunction.html https://reference.wolfram.com/language/ref/FindFormula. html

https://reference.wolfram.com/language/ref/RSolve.html


0

Чому б просто не зберегти float32 / float16? У нуме,

A.astype( np.float32 )  # 100M: 200 msec imac
A.astype( np.float16 )  # 100M: 700 msec

Це не зробить, якщо ви моделюєте ефект Батерфляй в теорії хаосу, але вони зрозумілі, портативні, "не вимагаючи жодної роботи з мого боку". І стиснення 2: 1/4: 1 над float64 важко перемогти :)

Примітки:

"Float16 типу масиву не підтримується в np.linalg"; після читання в ньому вам доведеться розширити його до 32 або 64.

Щоб побачити, як відрізняються параметри з плаваючою комою,

import numpy as np
for f in [np.float64, np.float32, np.float16]:
    print np.finfo(f)

Сюжет тривіального тестового випадку, що порівнює float 64 32 та 16, дивіться тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.