键值字符串的 h5py 数据集中的数据检索缓慢
Slow data retrieval in h5py dataset of key-value strings
给定以下 h5py 文件 root -> group1 -> million key,val pairs
:
检索任意数量的数据集(甚至 1 个)都需要非常长的时间(~10 秒),我想知道我是否可以以不同的方式插入它们以控制该行为(我假设缓存对于我的用例来说太大了,但默认大小为 1MB)
行为如下:
script A
hdf5 = h5py.File(path_to_h5py, libver='latest',mode='a')
hdf5_dataet = hdf5.create_group(name_of_dataset)
for key, val in tqdm(dataset.items()):
hdf5_dataet.create_dataset(json.dumps(key),data=json.dumps(val))
script B
f = h5py.File(path_to_h5py,'r')
data = f[name_of_dataset]
key_example = next(data.__iter__()) ---------> This takes 10 seconds
HDF5 不像 Python 字典那样使用 key/value 对。数据结构更像是 NumPy 数组。我不知道你最终想做什么。脚本 B 有一个简单得多的迭代器。试试这个:
h5f = h5py.File(path_to_h5py,'r')
data = h5f[name_of_dataset]
for key_example in data:
print (key_example)
2020 年 4 月 25 日添加了简单测试以检查 I/O 性能:
import h5py
import time
upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
lower = 'abcdefghijklmnopqrstuvwxyz'
nums = '0123456789'
with h5py.File('SO_61417130.h5','w') as h5w:
nrows = 16
nrpts = 100
#vstr_dt = h5py.string_dtype(encoding='utf-8') # for h5py 2.10.0
vstr_dt = h5py.special_dtype(vlen=str) # for h5py 2.9.0
vstr_ds = h5w.create_dataset('testvstrs', (nrpts*nrows,1), dtype=vstr_dt )
print (vstr_ds.dtype, ":", vstr_ds.shape)
rcnt = 0
for cnt1 in range(nrpts) :
for cnt2 in range(nrows) :
vstr_ds[rcnt]= ((cnt2+1)*(upper+lower+nums))
rcnt +=1
print (vstr_ds.dtype, ":", vstr_ds.shape)
print ('done writing')
start = time.clock()
for cnt in range(-nrows,0,1) :
find_str = vstr_ds[cnt]
print (len(find_str[0]))
print ('Elapsed time =', (time.clock() - start) )
给定以下 h5py 文件 root -> group1 -> million key,val pairs
:
检索任意数量的数据集(甚至 1 个)都需要非常长的时间(~10 秒),我想知道我是否可以以不同的方式插入它们以控制该行为(我假设缓存对于我的用例来说太大了,但默认大小为 1MB)
行为如下:
script A
hdf5 = h5py.File(path_to_h5py, libver='latest',mode='a')
hdf5_dataet = hdf5.create_group(name_of_dataset)
for key, val in tqdm(dataset.items()):
hdf5_dataet.create_dataset(json.dumps(key),data=json.dumps(val))
script B
f = h5py.File(path_to_h5py,'r')
data = f[name_of_dataset]
key_example = next(data.__iter__()) ---------> This takes 10 seconds
HDF5 不像 Python 字典那样使用 key/value 对。数据结构更像是 NumPy 数组。我不知道你最终想做什么。脚本 B 有一个简单得多的迭代器。试试这个:
h5f = h5py.File(path_to_h5py,'r')
data = h5f[name_of_dataset]
for key_example in data:
print (key_example)
2020 年 4 月 25 日添加了简单测试以检查 I/O 性能:
import h5py
import time
upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
lower = 'abcdefghijklmnopqrstuvwxyz'
nums = '0123456789'
with h5py.File('SO_61417130.h5','w') as h5w:
nrows = 16
nrpts = 100
#vstr_dt = h5py.string_dtype(encoding='utf-8') # for h5py 2.10.0
vstr_dt = h5py.special_dtype(vlen=str) # for h5py 2.9.0
vstr_ds = h5w.create_dataset('testvstrs', (nrpts*nrows,1), dtype=vstr_dt )
print (vstr_ds.dtype, ":", vstr_ds.shape)
rcnt = 0
for cnt1 in range(nrpts) :
for cnt2 in range(nrows) :
vstr_ds[rcnt]= ((cnt2+1)*(upper+lower+nums))
rcnt +=1
print (vstr_ds.dtype, ":", vstr_ds.shape)
print ('done writing')
start = time.clock()
for cnt in range(-nrows,0,1) :
find_str = vstr_ds[cnt]
print (len(find_str[0]))
print ('Elapsed time =', (time.clock() - start) )