Сохранение смешанных структурированных данных с помощью h5py - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть набор данных с 100 000 записей, каждая из которых имеет форму:

{
attr1 float[300]
attr2 float[300]
attr3 float[300]
attr4 float
attr5 float
attr6 float
}

Какой самый эффективный способ сохранить это в файле .hdf5?

1 Ответ

1 голос
/ 03 ноября 2019

Без ваших данных (и данных strcuture) или примера кода трудно привести пример, специфичный для вашей проблемы. Я создал пример PyTables, который показывает основные операции. Есть много способов определить структуру таблицы и ввести данные. Мне нравится создавать np.dtype и ссылку с description=. В этом примере я создаю и добавляю данные построчно, используя список с одним кортежем. Однако, если у вас есть все данные, вы можете создать структурированный массив Numpy и ссылку с параметром obj=. Это создаст массив и заполнит все за один снимок

Вот пример PyTables со 100 строками и массивами attr1 / 2/3 размером до 10 элементов. Это показывает логику. Вы можете изменить, чтобы увеличить количество строк и элементов массива.

Все методы таблицы PyTables описаны здесь:
Методы таблицы PyTables

import tables as tb
import numpy as np

attr1  = np.arange(10.)
attr2  = 2.0*np.arange(10.)
attr3  = 3.0*np.arange(10.)
attr4  = 4.0
attr5  = 5.0
attr6  = 6.0

ds_dt = np.dtype({'names':['attr1', 'attr2', 'attr3',
                           'attr4', 'attr5', 'attr6'],
                  'formats':[(float,10), (float,10), (float,10),
                              float, float, float ] }) 

with tb.File('SO_58674120_tb.h5','w') as h5f:

     tb1 = h5f.create_table('/','my_ds', description=ds_dt)
     for rcnt in range(1,100):
         data_list = [ (rcnt*attr1, rcnt*attr2, rcnt*attr3,
                        rcnt*attr4, rcnt*attr5, rcnt*attr6), ]
         tb1.append(data_list)

Вы можете сделать то же самое с h5py. Процесс похож, но есть различия. Например, вам нужно изменить размер набора данных на shape= и добавить maxshape=, если вы хотите расширить набор данных в будущем. Кроме того, я только знаю, как добавить данные, ссылаясь на массивы numpy (не списки, как PyTables). Поэтому я создал recarr для хранения промежуточных данных. Опять же, если у вас есть все ваши данные, вам не нужно загружать их построчно.

См. Код ниже:

import h5py
import numpy as np

attr1  = np.arange(10.)
attr2  = 2.0*np.arange(10.)
attr3  = 3.0*np.arange(10.)
attr4  = 4.0
attr5  = 5.0
attr6  = 6.0

ds_dt = np.dtype({'names':['attr1', 'attr2', 'attr3',
                           'attr4', 'attr5', 'attr6'],
                  'formats':[(float,10), (float,10), (float,10),
                              float, float, float ] }) 
recarr = np.empty((1,), dtype=ds_dt)

with h5py.File('SO_58674120_h5.h5','w') as h5f:

     h5f.create_dataset('my_ds', dtype=ds_dt, shape=(100,), maxshape=(None) )
     for rcnt in range(1,100):
         recarr['attr1']= rcnt*attr1
         recarr['attr2']= rcnt*attr2
         recarr['attr3']= rcnt*attr3
         recarr['attr4']= rcnt*attr4
         recarr['attr5']= rcnt*attr5
         recarr['attr6']= rcnt*attr6
         h5f['my_ds'][rcnt] = recarr[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...