2012-06-25 18 views
15

Me doy cuenta de que un usuario de SO ha pedido este question pero se me preguntó en 2009 y esperaba tener más conocimientos de HDF5 o versiones más recientes que resolvieran este problema en particular. Para replantear la pregunta aquí con respecto a mi propio problema;Eliminación de información de un archivo HDF5

Tengo un archivo gigantesco de nodos y elementos de una gran geometría y ya he recuperado toda la información útil que necesito de él. Por lo tanto, en Python, intento mantener el archivo original, pero elimino la información que no necesito y complete más información para otras fuentes. Por ejemplo, tengo un conjunto de datos de nodos que no necesito. Sin embargo, debo mantener el conjunto de datos vecinos e incluir información sobre sus índices a partir de un archivo externo. ¿Hay alguna forma de eliminar estos conjuntos de datos específicos?

¿O la antigua idea de tener "placekeepers" en el archivo HDF5 sigue siendo cierta, de modo que nadie sabe cómo/molesta con la eliminación de información? No estoy demasiado preocupado por el espacio vacío, siempre y cuando sea más rápido simplemente eliminar y agregar información para crear un archivo completamente nuevo.

Nota: Estoy usando H5py's 'r +' para leer y escribir.

Respuesta

15

Eliminar nodos completos (grupos o conjuntos de datos) de un archivo hdf5 no debería ser un problema. Sin embargo, si desea recuperar el espacio, debe ejecutar la herramienta h5repack.

Desde el hdf5 docs:

5.5.2. La eliminación de un conjunto de datos de un archivo y Reclamación de espacio

HDF5 no en este momento proporciona un mecanismo sencillo para eliminar un conjunto de datos desde un archivo o para recuperar el espacio de almacenamiento ocupado por un objeto eliminado .

La eliminación de un conjunto de datos y la recuperación del espacio utilizado se puede hacer con la función H5Ldelete y el programa de utilidad h5repack. Con la función H5Ldelete, los enlaces a un conjunto de datos se pueden eliminar de la estructura del archivo . Después de eliminar todos los enlaces, el conjunto de datos se vuelve inaccesible para cualquier aplicación y se elimina efectivamente del archivo . La forma de recuperar el espacio ocupado por un conjunto de datos desvinculado es para escribir todos los objetos del archivo en un nuevo archivo. Cualquier objeto no vinculado es inaccesible para la aplicación y no se incluirá en el nuevo archivo . Escribir objetos en un nuevo archivo se puede hacer con un programa personalizado o con el programa de utilidad h5repack.

También puede echar un vistazo a la herramienta ptrepack de PyTables. PyTables debería poder leer archivos h5py hdf5 y la herramienta ptrepack es similar a h5repack.

Si desea eliminar registros de un conjunto de datos, entonces probablemente tenga que recuperar los registros que desea conservar y crear un nuevo conjunto de datos y eliminar el anterior.
PyTables admite removing filas, sin embargo, no se recomienda.

+1

¡Muchas gracias por la explicación detallada y los enlaces útiles! Esto es exactamente lo que necesitaba. – Ason

+1

Gracias. Este sigue siendo el caso. Explorado/confirmado programáticamente [aquí] (https://github.com/jackdotwa/python-concepts/blob/master/hdf5/reclaiming_space.ipynb). –

0

Si sabe que un determinado conjunto de datos se eliminará al final de un proceso de análisis, ¿por qué mantenerlo en el archivo maestro? Guardaría los datos temporales en un archivo HDF5 separado que podría descartarse una vez que se haya completado el análisis.Si es importante vincular el conjunto de datos temporales dentro del archivo maestro, solo cree un enlace externo entre el maestro y la temperatura usando H5Lcreate_external(). Los enlaces externos consumen una cantidad trivial de espacio.

Cuestiones relacionadas