Сжатие данных в python / numpy - PullRequest
7 голосов
/ 19 августа 2011

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 19 августа 2011

Если вы не знаете что-то особенное в массивах (например, разреженность или какой-либо шаблон), вы не будете делать намного лучше, чем сжатие по умолчанию, и, возможно, 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)
1 голос
/ 25 июня 2013

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

В 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)
0 голосов
/ 10 июля 2018

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

...