2016-04-27 4 views
1

У меня есть h5py-набор данных, как показано ниже. Я хочу индексировать записи по строкам, а не по числовому значению. Так, например, Я мог бы получить значение первой записи на dset[dset.attrs['id1']].H5PY Writes Very Slow

Я пытаюсь написать атрибуты с помощью кода ниже, но он очень медленный. Если я делаю %timeit dset.attrs[rid] = idx в цикле, одна запись составляет около 310 мс. Строки, которые я пишу, - 36 символов. У меня около 100 тыс. Записей, которые мне нужно написать, что займет около 9 часов. Что-то должно быть ужасно неправильно? Также процессор привязан.

ids = ['id1', 'id2', 'id3'] 
h5 = h5py.File("/tmp/ds.h5", "w") 
dset = h5.create_dataset("lds", (100000,), dtype='float32') 

for idx, id in enumerate(ids): # loop takes forever 
    dset.attrs[id] = idx # takes about ~310ms 

EDIT

Minimal пример "работает".

for idx, rid in enumerate(range(10)): 
    %timeit dset.attrs[str(rid)] = idx 

10 loops, best of 3: 470 ms per loop 
10 loops, best of 3: 470 ms per loop 
... 

Почти 0,5 секунды для разовой записи.

+0

Какую версию h5py вы используете? –

+0

h5py.version.api_version is 1,8 Код тот же, за исключением того, что 'ids' - это заданный объект, содержащий все строки id. –

+0

Какова ваша 'h5py.version.version'? –

ответ

0

Используйте значение latest для параметра libver. Это лот быстрее. Так, например,

h5py.File('ds.h5', 'w', libver='latest') 

Смотрите здесь: https://github.com/h5py/h5py/issues/705