В чем преимущество сохранения файлов `.npz` вместо` .npy` в python, относительно скорости, памяти и поиска? - PullRequest
0 голосов
/ 17 января 2019

Документация Python для numpy.savez, которая сохраняет файл .npz:

Формат файла .npz представляет собой архивный файл с именами переменных, которые они содержат. Архив не сжат, и каждый файл в архиве содержит одну переменную в формате .npy. [...]

При открытии сохраненного файла .npz с загрузкой объект NpzFile имеет вид вернулся. Это словарь-объект, который может быть запрошен для его список массивов (с атрибутом .files) и для массивов сами по себе.

Мой вопрос: в чем смысл numpy.savez?

Это просто более элегантная версия (более короткая команда) для сохранения нескольких массивов или ускорение процесса сохранения / чтения? Занимает ли оно меньше памяти?

Ответы [ 2 ]

0 голосов
/ 30 июля 2019

Ответы на ваш вопрос состоят из двух частей.

I. NPY против NPZ

Как мы уже читали из документа, формат .npy:

стандартный двоичный формат файла в NumPy для сохранения одного произвольного массива NumPy на диске. ... Формат разработан так, чтобы быть максимально простым при достижении своих ограниченных целей. ( источники )

А .npz - это всего лишь

простой способ объединения нескольких массивов в один файл, можно использовать ZipFile для хранения нескольких файлов «.npy». Мы рекомендуем использовать расширение файла «.npz» для этих архивов. ( источники )

Итак, .npz - это просто ZipFile, содержащий несколько файлов «.npy». И этот ZipFile может быть сжатым (используя np.savez_compressed) или несжатым (используя np.savez) .

Это похоже на файл архива tarball в Unix-подобной системе, где файл tarball может быть просто несжатым файлом архива, который содержит другие файлы или сжатый файл архива, в сочетании с различными программами сжатия (gzip, bzip2 и т. Д.)

II. Различные API для двоичной сериализации

И Numpy также предоставляет различных API для вывода этих двоичных файлов:

  • np.save ---> Сохранить массив в двоичный файл в формате NumPy .npy
  • np.savez -> Сохранить несколько массивов в одном файле в без сжатия .npz в формате
  • np.savez_compressed -> Сохранить несколько массивов в один файл в сжатом .npz формате
  • np.load -> Загрузка массивов или засоленных объектов из .npy, .npz или засоленных файлов

Если мы просматриваем исходный код Numpy, под капотом , есть:

def _savez(file, args, kwds, compress, allow_pickle=True, pickle_kwargs=None):
    ...
    if compress:
        compression = zipfile.ZIP_DEFLATED
    else:
        compression = zipfile.ZIP_STORED
    ...


def savez(file, *args, **kwds):
    _savez(file, args, kwds, False)


def savez_compressed(file, *args, **kwds):
    _savez(file, args, kwds, True)

Тогда вернемся к вопросу:

Если используется только np.save, в верхней части формата .npy сжатия больше нет, только один файл архива для удобства управления несколькими связанными файлами.

Если использовать np.savez_compressed, то, конечно, меньше памяти на диске из-за большего количества процессорного времени, чтобы выполнить работу сжатия (то есть немного медленнее).

0 голосов
/ 17 января 2019

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

Недостатком npz файлов является то, что они не могут быть отображены в память (используя load(<file>, mmap_mode='r')), поэтому для больших массивов они могут быть не лучшим выбором. Для данных, где массивы имеют общую форму, я бы посоветовал взглянуть на структурированные массивы . Они могут быть отображены в память, разрешать доступ к данным с помощью dict-подобного синтаксиса (то есть arr['field']) и очень эффективны в отношении памяти.

...