我有一个包含100000个条目的数据集,每个条目的形式为:
{
attr1 float[300]
attr2 float[300]
attr3 float[300]
attr4 float
attr5 float
attr6 float
}
将其存储在.hdf5
文件中最有效的方法是什么?
如果没有数据(和数据结构(或代码示例,很难提供特定于问题的示例。我创建了一个PyTables示例,展示了基本操作。有很多方法可以定义表结构和输入数据。我喜欢创建一个np.dtype
并使用description=
进行引用。在本例中,我使用一个包含一个元组的列表逐行创建和添加数据。但是,如果您拥有所有数据,则可以创建一个NumPy结构化数组,并使用obj=
参数进行引用。这将创建阵列并一次性填充
以下是PyTables示例,其中包含100行和大小为10个元素的attr1/2/3数组。它显示了逻辑。可以进行修改以增加行数和数组元素数。
这里解释了所有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]