Какой самый компактный способ хранения данных numpy? - PullRequest
0 голосов
/ 14 апреля 2020

У меня большой набор данных.

Лучшее, чего я мог достичь, это использовать numpy массивы и сделать из него двоичный файл, а затем сжать его:

my_array = np.array([1.0, 2.0, 3.0, 4.0])
my_array.tobytes()
my_array = zlib.compress(my_array)

С помощью моего Однако для реальных данных двоичный файл становится размером 22 МБ, поэтому я надеюсь сделать его еще меньше. Я обнаружил, что по умолчанию 64-битные машины используют float64, который занимает 24 байта в памяти, 8 байтов для указателя на значение, 8 байтов для двойной точности и 8 байтов для сборщика мусора. Если я изменяю его на float32, я получаю много памяти, но теряю в точности, я не уверен, хочу ли я этого, но как насчет 8 байтов для сборщика мусора, он автоматически удаляется?

Замечания: Я уже пробовал мариновать, рассасывать, msgpack, но 22мб - лучший размер, которого мне удалось достичь.

1 Ответ

1 голос
/ 14 апреля 2020

Массив с 46800 x 4 x 18 8-байтовыми числами с плавающей запятой занимает 26956800 байтов. Это 25,7 МБ или 27,0 МБ. Сжатый размер 22 МБ - это сжатие 18% (или 14%, если вы действительно имели в виду MiB), что довольно хорошо по большинству стандартов, особенно для случайных двоичных данных. Вы вряд ли сможете улучшить это. Использование меньшего типа данных, такого как float32, или, возможно, попытка представить ваши данные как рациональные.

Поскольку вы упоминаете, что хотите хранить метаданные, вы можете записать байт для числа измерений (numpy допускает не более 32 измерений) и N целых чисел для размера в каждом измерении (32 или 64 бит). Допустим, вы используете 64-битные целые числа. Это составляет 193 байта метаданных в вашем конкретном случае или 7 * 10 -4 % от общего размера массива.

...