read open create python hdf5 h5py

python - create - h5py open file



Escrituras incrementales a hdf5 con h5py (2)

Tengo una pregunta sobre la mejor manera de escribir en archivos hdf5 con python / h5py.

Tengo datos como:

----------------------------------------- | timepoint | voltage1 | voltage2 | ... ----------------------------------------- | 178 | 10 | 12 | ... ----------------------------------------- | 179 | 12 | 11 | ... ----------------------------------------- | 185 | 9 | 12 | ... ----------------------------------------- | 187 | 15 | 12 | ... ...

con alrededor de 10 ^ 4 columnas, y alrededor de 10 ^ 7 filas. (Eso es aproximadamente 10 ^ 11 (100 mil millones) de elementos, o ~ 100 GB con 1 byte ints).

Con estos datos, el uso típico es prácticamente escribir una vez, leer muchas veces, y el caso típico de lectura sería tomar la columna 1 y otra columna (digamos 254), cargar ambas columnas en la memoria y hacer algunas estadísticas sofisticadas.

Creo que una buena estructura de hdf5 sería que cada columna de la tabla anterior sea un grupo hdf5, lo que da como resultado 10 ^ 4 grupos. De esa manera no necesitaremos leer todos los datos en la memoria, ¿sí? La estructura hdf5 aún no está definida, por lo que puede ser cualquier cosa.

Ahora la pregunta: recibo los datos ~ 10 ^ 4 filas a la vez (y no exactamente el mismo número de filas cada vez), y necesito escribirlos de manera incremental en el archivo hdf5. ¿Cómo escribo ese archivo?

Estoy considerando python y h5py, pero podría ser otra herramienta si se recomienda. Está fragmentando el camino a seguir, por ejemplo, con

dset = f.create_dataset("voltage284", (100000,), maxshape=(None,), dtype=''i8'', chunks=(10000,))

y luego, cuando llega otro bloque de 10 ^ 4 filas, ¿reemplazar el conjunto de datos?

¿O es mejor simplemente almacenar cada bloque de 10 ^ 4 filas como un conjunto de datos separado? ¿O realmente necesito saber el número final de filas? (Eso será difícil de conseguir, pero tal vez sea posible).

Puedo rescatar a hdf5 si no es la herramienta adecuada para el trabajo, aunque creo que una vez que las escrituras torpes hayan terminado, será maravilloso.


Como @unutbu señaló, dset.resize es una excelente opción. Puede ser un trabajo mientras miras a los pandas y su soporte HDF5 que puede ser útil dado tu flujo de trabajo. Parece que HDF5 es una opción razonable dadas sus necesidades, pero es posible que su problema se pueda expresar mejor usando una capa adicional en la parte superior.

Una cosa importante a considerar es la orientación de los datos. Si está interesado principalmente en las lecturas, y principalmente está obteniendo datos por columna, entonces suena como si quisiera transponer los datos de modo que las lecturas puedan suceder por filas, ya que HDF5 se almacena en el orden de las principales filas.


Según las preguntas frecuentes , puede expandir el conjunto de datos utilizando dset.resize . Por ejemplo,

import os import h5py import numpy as np path = ''/tmp/out.h5'' os.remove(path) with h5py.File(path, "a") as f: dset = f.create_dataset(''voltage284'', (10**5,), maxshape=(None,), dtype=''i8'', chunks=(10**4,)) dset[:] = np.random.random(dset.shape) print(dset.shape) # (100000,) for i in range(3): dset.resize(dset.shape[0]+10**4, axis=0) dset[-10**4:] = np.random.random(10**4) print(dset.shape) # (110000,) # (120000,) # (130000,)