Использование Python для сжатия данных, например, в 12-битные блоки? - PullRequest
2 голосов
/ 04 ноября 2019

У меня есть тип данных, который выводится в виде ~ 28 миллионов целых чисел в диапазоне от 0 до 4095 (Технически это происходит из аппаратного обеспечения в виде 16-разрядных целых чисел со знаком в диапазоне от 0 до (1/2) * 2 ^ 16, но это представление излишне точное). Следовательно, в принципе, значение каждого datapoint может быть представлено 12 битами - байтом и небольшим количеством, если хотите. В долгосрочной перспективе я имею дело с умеренно большими объемами этих данных (терабайты в двузначных числах), которые я намерен хранить в виде двоичных файлов, поэтому очевидно, что сжатие без потерь до 75% размера будет приветствоваться.

Очевидно, я мог бы просто написать функцию, которая кодирует мои данные в логические значения и обратно, и использовать двоичные функции обработки Numpy для анализа. Однако я должен сбалансировать это с легкостью / скоростью хранения и извлечения. Поэтому мне интересно, есть ли какой-нибудь существующий пакет, алгоритм и т. Д., Который выполняет это простым и эффективным способом. Я могу работать с Fortran или C, если мне нужно, поэтому есть возможность сделать модуль для них, но мои коллеги предпочли бы, если бы я этого не сделал.

Ответы [ 2 ]

3 голосов
/ 04 ноября 2019

Вы пробовали gzip.compress()? https://docs.python.org/3/library/gzip.html

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

2 голосов
/ 04 ноября 2019

Не могли бы вы упаковать / сдвинуть два 12-битных целых числа в массив из трех байтов (24 бита), а затем использовать сдвиг битов, чтобы получить верхний и нижний 12 бит?

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

Я не знаю тонны о numpy, но из беглого взгляда я считаю, что он может хранить массивы байтов, и в Python есть операнды со сдвигом битов. Если производительность является требованием, можно изучить Cython для битовых операций на C на unsigned char * в Python.

Вам необходимо определить смещения, чтобы вы всегда получали правильный начальный байт, или вы получили бы что-то вроде " мутации смещения кадра " в биологическом смысле. Это может быть плохой новостью для контейнеров данных размером с ТБ.

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