Размер на диске частично заполненного набора данных 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 МиБ, больше для больших наборов данных. Также имейте в виду, что при обращении к любому элементу чанка весь чанк считывается с диска.