Размер на диске частично заполненного набора данных HDF5

Я читаю книгу Python и HDF5 (O'Reilly), в которой есть раздел о пустых наборах данных и размере, который они принимают на диске:

import numpy as np
import h5py

f = h5py.File("testfile.hdf5")
dset = f.create_dataset("big dataset", (1024**3,), dtype=np.float32)
f.flush()
# Size on disk is 1KB

dset[0:1024] = np.arange(1024)
f.flush()
# Size on disk is 4GB

После заполнения части (первых 1024 записей) набора данных значениями я ожидал, что файл будет расти, но не до 4 ГБ. Это по сути тот же размер, что и когда я делаю:

dset[...] = np.arange(1024**3)

В книге говорится, что размер файла на диске должен быть около 66 КБ. Кто-нибудь может объяснить, в чем причина внезапного увеличения размера?

Информация о версии:

  • Python 3.6.1 (OSX)
  • h5py 2.7.0

1 ответ

Решение

Если вы откроете свой файл в HdfView, вы увидите, что фрагментация отключена. Это означает, что массив хранится в одном непрерывном блоке памяти в файле и не может быть изменен. Таким образом, все 4 ГБ должны быть выделены в файле.

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

dset = f.create_dataset("big dataset", (1024**3,), dtype=np.float32, chunks=True)

chunks=True Давайте h5py определить размер кусков автоматически. Вы также можете установить размер чанка явно. Например, чтобы установить значение 16384 с плавающей запятой (=64 КБ), используйте:

dset = f.create_dataset("big dataset", (1024**3,), dtype=np.float32, chunks=(2**14,) )

Лучший размер блока зависит от шаблонов чтения и записи ваших приложений. Обратите внимание, что:

Чанкинг влияет на производительность. Рекомендуется сохранять общий размер ваших чанков от 10 КиБ до 1 МиБ, больше для больших наборов данных. Также имейте в виду, что при обращении к любому элементу чанка весь чанк считывается с диска.

См. http://docs.h5py.org/en/latest/high/dataset.html.

Другие вопросы по тегам