Медленный поиск данных в наборе данных h5py строк ключ-значение - PullRequest
0 голосов
/ 24 апреля 2020

Учитывая следующий файл h5py root -> group1 -> million key,val pairs:
Получение любого количества наборов данных (даже 1) занимает очень много времени (~ 10 секунд), и мне интересно, могу ли я вставить их по-другому, чтобы контролировать это поведение (я полагаю, что кеширование слишком велико для моего варианта использования, но размер по умолчанию составляет 1 МБ)
Поведение выглядит следующим образом:

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

1 Ответ

1 голос
/ 25 апреля 2020

HDF5 не использует пары ключ / значение, как словарь Python. Структуры данных больше похожи на NumPy массивы. Я не знаю, что вы в конечном итоге пытаетесь сделать. Существует гораздо более простой итератор для сценария B. Попробуйте это:

h5f = h5py.File(path_to_h5py,'r')
data = h5f[name_of_dataset]
for key_example in data:
    print (key_example)

Простой тест добавлен в 2020-04-25 для проверки производительности ввода-вывода:

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) )  
...