Сжатие данных в python/numpy

Я смотрю на использование облака amazon для всех моих потребностей моделирования. Результирующие sim-файлы довольно большие, и я хотел бы переместить их на свой локальный диск для удобства анализа и т. д. Вы должны платить за данные, которые вы перемещаете, поэтому я хочу сжать все мои SIM-карты как можно меньше. Они просто массивы numpy, сохраненные в виде .mat файлы, используя:

import scipy.io as sio
sio.savemat(filepath, do_compression = True) 

Итак, мой вопрос: каков наилучший способ сжатия массивов numpy (они в настоящее время хранятся в .файлы mat, но я мог бы хранить их с помощью любого метода python), используя сохранение сжатия python, сжатие linux или оба?

Я нахожусь в среде linux, и я открыт для любого сжатия файлов.

3 ответов


Если вы не знаете что-то особенное о массивах (например, разреженность или какой-то шаблон), вы не будете делать намного лучше, чем сжатие по умолчанию, и, возможно, gzip поверх этого. На самом деле вам может даже не понадобиться gzip файлы, если вы используете HTTP для загрузки, и ваш сервер настроен на сжатие. Хорошие алгоритмы сжатия без потерь редко изменяется более чем на 10%.

Если savemat работает так, как рекламируется, вы сможете получить сжатие gzip в python с:

import scipy.io as sio
import gzip

f_out = gzip.open(filepath_dot_gz, 'wb')
sio.savemat(f_out, do_compression = True)

также LZMA (он же xz) дает очень хорошее сжатие на довольно разреженных массивах numpy, хотя это довольно медленно при сжатии (и может потребовать больше памяти).

В Ubuntu он установлен с sudo apt-get install python-lzma

он используется как любая другая оболочка файла-объекта, что-то вроде этого (для загрузки маринованных данных):

from lzma import LZMAFile
import cPickle as pickle

if fileName.endswith('.xz'):
   dataFile = LZMAFile(fileName,'r')
else:
   dataFile = file(fileName, 'ro')     
data = pickle.load(dataFile)

хотя это не обязательно даст вам самые высокие коэффициенты сжатия, у меня был хороший опыт сохранения сжатых массивов numpy на диск с python-blosc. Это очень быстро и хорошо интегрируется с numpy.