私は現在HDF5を調査しています。スレッド「 EvaluatingHDF5」から興味深いコメントを読みました。HDF5がデータを保存するための最適なソリューションであることを理解していますが、どのようにクエリしますか?たとえば、いくつかの識別子を含む大きなファイルがあるとします。特定の識別子がファイルに存在するかどうかをすばやく知る方法はありますか?
4 に答える
答えは「直接ではない」だと思います。
機能を実現できると思う方法をいくつか紹介します。
グループを使用する:
グループの階層を基数木の形式で使用して、データを格納できます。ただし、これはおそらくあまりうまくスケーリングしません。
インデックスデータセットを使用します。
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-FastQuery:
このホワイトペーパー(およびこのページ)では、ビットマップインデックスを使用して、HDFデータセットに対して複雑なクエリを実行する方法について説明します。私はこれを試していません。
H5Lexistsは、HDF51.8.0でこのために導入されました。
http://www.hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-Exists
H5Literateを使用してHDF5ファイルにあるものを反復処理することもできます。
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/papers/HDF5_SQL.pdf
これはあなたが必要なものですか?宣言型言語であるSQLを使用してHDF5データをクエリできます。
FastQueryとは異なり、この作業にはインデックスはありませんが、私たちのグループはビットマップインデックスを備えたオープンソースバージョンも提供しています。
さらに、クエリ(特に集計の場合)をリアルタイムで完了したい場合は、おおよその集計またはオンライン集計を検討する必要があります。また、HDF5で直接動作するいくつかの製品を開発しました。
さらに、HDF5を介した一部のクエリは、リレーショナルデータベースで見られるものよりもはるかに複雑になる可能性があります。一部のクエリは、リレーショナルテーブル指向ではなく配列指向です。「SciQL」をグーグルで検索すると、配列ベースのデータモデル用の複雑でユニークなクエリタイプを見つけることができます。これは確かにHDF5に適用できます。そのようなクエリを実行する必要がありますか?また、そこで複雑なクエリタイプのいくつかをサポートする製品を開発しました。
識別子とはどういう意味ですか?属性を意味する場合は、このチュートリアルを確認してください。Cの場合:
status = H5Aread(attr_id, mem_type_id, buf);
status = H5Awrite(attr_id, mem_type_id, buf);