Вопрос

В настоящее время я исследую HDF5.Я прочитал интересные комментарии из этой темы "Оценка HDF5" и я понимаю, что HDF5 - это предпочтительное решение для хранения данных, но как вы запрос это ?Например, допустим, у меня есть большой файл, содержащий некоторые идентификаторы :Есть ли способ быстро узнать , присутствует ли данный идентификатор в файле?

Это было полезно?

Решение

Я думаю, что ответ будет "не напрямую".

Вот некоторые из способов, которыми, я думаю, вы могли бы добиться такой функциональности.

Используйте группы:

Иерархия групп может быть использована в виде Исходное Дерево для хранения данных.Хотя, вероятно, это масштабируется не слишком хорошо.

Используйте индексные наборы данных:

HDF имеет ссылочный тип, который может быть использован для ссылки на основную таблицу из отдельных индексных таблиц.После записи основных данных можно использовать другие наборы данных, отсортированные по другим ключам со ссылками.Например:

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) }

Чтобы использовать вышеизложенное, при поиске поля в индексных таблицах должен быть записан двоичный поиск.

В индексе памяти:

В зависимости от размера набора данных может быть так же просто использовать индекс в памяти, который считывается / записывается в свой собственный набор данных, используя что-то вроде "boost::serialize".

HDF5-Быстрый запрос:

Это бумага (а также это Страница) опишите использование растровых индексов для выполнения сложных запросов к набору данных HDF.Я этого не пробовал.

Другие советы

H5лексисты был введен для этого в HDF5 1.8.0:

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

Вы также можете повторить то, что находится в файле HDF5 с H5литература:

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

Но вы также можете вручную проверить наличие предыдущих версий, попытавшись открыть набор данных.Мы используем подобный код для работы с любой версией 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
}

Возможно, этот документ будет вам очень полезен.http://www.cse.ohio-state.edu /~wayi/документы/HDF5_SQL.pdf

Это то, что вам нужно?Вы можете запросить данные HDF5 с помощью SQL, который является декларативным языком.

В отличие от FastQuery, в этой работе нет индекса, но наша группа также предоставляет версию с открытым исходным кодом с растровым индексом.

Более того, если вы хотите выполнить запрос (особенно для агрегирования) в режиме реального времени, вам следует рассмотреть приблизительное агрегирование или онлайн-агрегацию.Я также разработал несколько продуктов, которые непосредственно работают на HDF5.

Кроме того, некоторые запросы через HDF5 могут быть намного более сложными, чем то, что вы, возможно, видели в реляционных базах данных.Некоторые запросы ориентированы на массив, а не на реляционную таблицу.Просто загуглите "SciQL", тогда вы сможете найти несколько сложных и уникальных типов запросов для модели данных на основе массива, которые, безусловно, могут быть применены к HDF5.Нужно ли вам выполнять такого рода запросы?Я также разработал продукт для поддержки некоторых из существующих там сложных типов запросов.

Что вы имеете в виду под идентификатор ?Если вы имеете в виду атрибут, проверить этот учебник.В C:

status = H5Aread(attr_id, mem_type_id, buf);
status = H5Awrite(attr_id, mem_type_id, buf);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top