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
Respuesta
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.
¿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);
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
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
}
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í.
- 1. Datos fragmentados HDF5 DataSet y tamaño de tabla
- 2. HDF5 Interfaz C++: escribir matrices 2D dinámicas
- 3. Eliminación de información de un archivo HDF5
- 4. HDF5 visores/editores Linux
- 5. HDF5 C Generación de código
- 6. ¿Cómo probar si un DataSet está vacío?
- 7. Agregar un DataSet existente a Report .rdlc
- 8. clase DataSet en Java?
- 9. Datatable vs Dataset
- 10. Buscando un .Net ORM
- 11. escribir un impulso :: multi_array a HDF5 conjunto de datos
- 12. Concatenar una gran cantidad de archivos HDF5
- 13. .NET - ¿Stream DataSet (de datos XML) a un archivo ZIP?
- 14. hdf5/h5py ImportError: libhdf5.so.7
- 15. Soporte de matriz dispersa en HDF5
- 16. Cómo compilar un esquema que usa un DataSet (xs: schema)?
- 17. Exportar un C# DataSet a un archivo de texto
- 18. Cómo convertir un DataTable/DataSet en un ObjectDataSource
- 19. Iterar a través de DataSet
- 20. Desactiva IDENTITY_INSERT para Dataset insert
- 21. Entity framework 4 o DataSet?
- 22. Persistencia de datos de datos de simulación científica, Mongodb + HDF5?
- 23. Diferencia entre DataSource y DataSet
- 24. C#: ¿Qué más usa además DataSet
- 25. Diferencia entre el archivo HDF5 y el archivo PyTables
- 26. Buscando un ByteArrayInputStream usando java.io
- 27. Buscando un ifelse más eficiente()
- 28. Buscando un objectGUID en AD
- 29. Buscando un código poco optimizado
- 30. Buscando un tutorial de Kinect
¿Cuál de las opciones de respuesta de Richard Corden usó? – coelhudo
conjuntos de datos de índice. – Pierre