2009-11-06 24 views
14

Actualmente estoy explorando HDF5. He leído los comentarios interesantes del hilo "Evaluating HDF5" y entiendo que HDF5 es una solución de elección para almacenar los datos, pero ¿cómo se puede consultar? Por ejemplo, supongamos que tengo un archivo grande que contiene algunos identificadores: ¿hay alguna manera de saber rápidamente si un identificador dado está presente en el archivo?Buscando un dataset HDF5

+0

¿Cuál de las opciones de respuesta de Richard Corden usó? – coelhudo

+0

conjuntos de datos de índice. – Pierre

Respuesta

6

Creo que la respuesta es "no directamente".

Estas son algunas de las formas en que creo que podría lograr la funcionalidad.

Use grupos:

una jerarquía de grupos podrían ser utilizados en la forma de un Radix Tree para almacenar los datos. Sin embargo, esto probablemente no se escala demasiado bien.

Uso del índice conjuntos de datos:

HDF tiene un tipo de referencia que se podría utilizar para vincular a una tabla principal de unas tablas de índice por separado. Después de escribir los datos principales, se pueden usar otros conjuntos de datos ordenados en otras teclas con referencias. Por ejemplo:

MainDataset (sorted on identifier) 
0: { A, "C", 2 } 
1: { B, "B", 1 } 
2: { C, "A", 3 } 

StringIndex 
0: { "A", Reference ("MainDataset", 2) } 
1: { "B", Reference ("MainDataset", 1) } 
2: { "C", Reference ("MainDataset", 0) } 

IntIndex 
0: { 1, Reference ("MainDataset", 1) } 
1: { 2, Reference ("MainDataset", 0) } 
2: { 3, Reference ("MainDataset", 2) } 

Con el fin de utilizar lo anterior una búsqueda binaria tendrá que ser por escrito al mirar para arriba el campo de las tablas de índice.

En Índice de memoria:

Dependiendo del tamaño del conjunto de datos puede ser tan fácil de usar una memoria de índice en que se lee/escribe en su propio conjunto de datos utilizando algo así como "impulso :: serialize ".

HDF5-FastQuery:

Este paper (y también este page) describen el uso de índices de mapa de bits para realizar consultas complejas sobre un conjunto de datos HDF. No he intentado esto.

0

¿Qué quiere decir con identificador? Si se refiere a un atributo , marque this tutorial. En C:

status = H5Aread(attr_id, mem_type_id, buf); 
status = H5Awrite(attr_id, mem_type_id, buf); 
+1

Por identificador, me refiero a algo así como un nombre único, una clave principal. El ejemplo describe cómo crear un atributo, pero ¿cómo se puede usar para buscar? – Pierre

4

H5Lexists se introdujo para esto en HDF5 1.8.0:

http://www.hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-Exists

También puede iterar sobre las cosas que están en un archivo HDF5 con H5Literate:

http://www.hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-Iterate

Pero también puede verificar manualmente las versiones anteriores intentando abrir un conjunto de datos.Utilizamos un código como este para tratar con cualquier versión de HDF5:

bool DoesDatasetExist(const std::string& rDatasetName) 
{ 
#if H5_VERS_MAJOR>=1 && H5_VERS_MINOR>=8 
    // This is a nice method for testing existence, introduced in HDF5 1.8.0 
    htri_t dataset_status = H5Lexists(mFileId, rDatasetName.c_str(), H5P_DEFAULT); 
    return (dataset_status>0); 
#else 
    bool result=false; 
    // This is not a nice way of doing it because the error stack produces a load of 'HDF failed' output. 
    // The "TRY" macros are a convenient way to temporarily turn the error stack off. 
    H5E_BEGIN_TRY 
    { 
     hid_t dataset_id = H5Dopen(mFileId, rDatasetName.c_str()); 
     if (dataset_id>0) 
     { 
      H5Dclose(dataset_id); 
      result = true; 
     } 
    } 
    H5E_END_TRY; 
    return result; 
#endif 
} 
2

Quizás este papel sea de gran ayuda para usted. http://www.cse.ohio-state.edu/~wayi/papers/HDF5_SQL.pdf

¿Es esto lo que necesita? Puede consultar datos HDF5 con SQL, que es un lenguaje declarativo.

A diferencia de FastQuery, no hay ningún índice en este trabajo, pero nuestro grupo también proporciona una versión de código abierto con índice de mapa de bits.

Además, si desea completar la consulta (especialmente para la agregación) en tiempo real, debe considerar la agregación aproximada o la agregación en línea. También he desarrollado algunos productos que funcionan directamente en HDF5.

Además, algunas consultas sobre HDF5 pueden ser mucho más complejas de lo que puede haber visto en las bases de datos relacionales. Algunas consultas están orientadas a matrices en lugar de orientadas a tablas relacionales. Simplemente google "SciQL", entonces puede encontrar algunos tipos de consultas complejas y únicas para el modelo de datos basado en matrices, que sin duda se pueden aplicar a HDF5. ¿Necesita realizar ese tipo de consultas? También he desarrollado un producto para admitir algunos de los complicados tipos de consultas allí.