Ошибка при сохранении файла hdf5 со списком строк - PullRequest
0 голосов
/ 28 мая 2020
def storeFlagsFile(FLAGS_F, file_name, t0, text, ID):
    if not FLAGS_F:  # this flag doesnt work for mulitple users
        f = h5py.File(file_name, "r+")
        data_content = np.array([np.round(time.time() - t0, 3), text])
        asciiList = np.array([str(n).encode("utf-8", "ignore") for n in data_content]).reshape(1, 2)
        dt = h5py.string_dtype(encoding='utf-8')
        dset = f[str(ID)].create_dataset('AcqFlags', data=asciiList, compression="gzip", chunks=True, maxshape=(None, 2), dtype=dt)
        FLAGS_F = 1
    else:
        f = h5py.File(file_name, "r+")        
        data_content = np.array([np.round(time.time() - t0, 3), text]) 
        asciiList = np.array([str(n).encode("utf-8", "ignore") for n in data_content]).reshape(1, 2)
        f[str(ID)+'/AcqFlags'].resize((f[str(ID)+'/AcqFlags'].shape[0] + 1), axis = 0)
        f[str(ID)+'/AcqFlags'][-1:] = asciiList

Я хочу сохранить такой формат данных в формате (None, 2), поскольку я постоянно обновляю строку данных для каждой строки, вызывая функцию storeFlagsFile.

['4.412' 'a']
['5.412' 'b']
['6.412' 'c']
['8.226' 'd']

, в котором t0 первый столбец и текст = второй столбец данных, которые я даю как входную строку для каждой строки в storeFlagsFile (FLAGS_F, file_name, t0, text, ID). FLAGS_F изначально равен 0 и ID = "122".

но я наблюдаю за файлом hdf5 следующим образом: enter image description here

Может ли кто-нибудь указать мне, кто я? поступаете неправильно, пожалуйста? Спасибо!

1 Ответ

2 голосов
/ 28 мая 2020

Мне непонятно, почему вы не получаете 2 поля в вашем AcqFlags наборе данных. Мне удалось заставить ваш сегмент кода работать с небольшой модификацией. (Я использую h5py 2.9.0. В h5py 2.10.0 для строк переменной длины был добавлен новый dtype. Это изменение отмечено комментариями в объявлениях dt=. Это не ошибка в вашем коде.) См. Ниже.

import h5py, numpy as np
import time

def storeFlagsFile(FLAGS_F, file_name, t0, text, ID):
    if not FLAGS_F:  # this flag doesnt work for mulitple users
        with h5py.File(file_name, "r+") as f:
            data_content = np.array([np.round(time.time() - t0, 3), text])
            asciiList = np.array([str(n).encode("utf-8", "ignore") for n in data_content]).reshape(1, 2)
            #dt = h5py.string_dtype(encoding='utf-8') # for h5py 2.10.0
            dt = h5py.special_dtype(vlen=str)   # for h5py 2.9.0
            dset = f[str(ID)].create_dataset('AcqFlags', data=asciiList, compression="gzip", chunks=True, maxshape=(None, 2), dtype=dt)
            FLAGS_F = 1
    else:
        with h5py.File(file_name, "r+") as f:      
            data_content = np.array([np.round(time.time() - t0, 3), text]) 
            asciiList = np.array([str(n).encode("utf-8", "ignore") for n in data_content]).reshape(1, 2)
            f[str(ID)+'/AcqFlags'].resize((f[str(ID)+'/AcqFlags'].shape[0] + 1), axis = 0)
            f[str(ID)+'/AcqFlags'][-1:] = asciiList

file_name = 'SO_62064344.h5'
ID = 122
with h5py.File(file_name, 'w') as f:
    f.create_group(str(ID))

storeFlagsFile(False, file_name, 4.412, 'a', ID)       
storeFlagsFile(True, file_name, 5.412, 'b', ID)       
storeFlagsFile(True, file_name, 6.412, 'c', ID)       
storeFlagsFile(True, file_name, 8.226, 'd', ID)     
storeFlagsFile(True, file_name, 9.773, 'e', ID)  

Дополнительные мысли / наблюдения:

  1. Я заметил, что вы сохраняете значение времени в виде строки. Это то, что вы хотите? HDF5 и h5py могут хранить разные типы данных в каждом поле / столбце, поэтому вы можете смешивать числа с плавающей запятой и строки и, если хотите. Требуется другой тип dtype (например, массив записей).
  2. Вы используете FLAGS_F как флаг для создания набора данных AcqFlags. Вы можете упростить это, чтобы проверить наличие, или использовать require_dataset.
  3. Вы добавляете по одной строке в набор данных с изменяемым размером. Это нормально для наборов данных smalli sh, но может быть проблемой производительности, если вы создаете 10e6 строк по 1 строке за раз.
  4. Если вам интересно, я ответил на другие вопросы, которые показывают, как сделать № 2 и № 3 выше. Один из этих ответов может оказаться полезным:

...