Как сжать массивы numpy перед вставкой в ​​набор данных LMDB?

У меня размер тензоров [82,3,780,1024] - слияние 82 разных кадров изображения - в формате uint8. LMDB сходит с ума по размеру, когда я начинаю их вставлять. Есть ли способ сжать эти тензоры перед вставкой?

Для вставки я следую вопросу здесь

Я нахожу решение с cv2.encode и cv2.decode, но оно не применимо к таким тензорам.


person erogol    schedule 06.06.2017    source источник


Ответы (1)


Вы можете использовать один из многих быстрых алгоритмов сжатия в памяти. Одним из очень хороших вариантов было бы использование библиотеки blosc, которая сама по себе позволяет использовать довольно много алгоритмов, специализированных (или выполняющих хорошо) в этом сценарии.

Вы можете получить список поддерживаемых алгоритмов сжатия, вызвав (в blosc версии 1.4.4)

import blosc
blosc.compressor_list()
['blosclz', 'lz4', 'lz4hc', 'snappy', 'zlib', 'zstd']

и вы можете сжимать/распаковывать любые двоичные данные или строки, используя обычные методы blosc.compress(bytesobj, typesize=8, clevel=9, shuffle=1, cname='blosclz') и blosc.decompress(bytesobj).

Обычно я использую один из вариантов blosc, если мне нужна скорость, и библиотеку bz2, если мне нужны очень хорошие коэффициенты сжатия (но более медленное время работы).

person Adam Kania    schedule 18.07.2017