2011-03-21 12 views
2

H5TB APIを使用して、hdf5ファイルのテーブルとして(等距離ではない)時系列を格納します。hdf5時系列でのクエリの実行方法

time channel1 channel2 
0.0 x   x 
1.0 x   x 
2.0 x   x 

このような「詳細データ」の挿入もあります:

time channel1 channel2 
0.0 x   x 
1.0 x   x 
1.2 x   x 
1.4 x   x 
1.6 x   x 
1.8 x   x 
2.0 x   x 

は今、私は別のデータ形式でデータを保存したいので、私は「クエリしたいが、フォーマットは次のようです「このようなHDF5ファイル:

select ch1 where time > 1.6 && time < 3.0 

私はこのクエリを実行するには、いくつかの方法を考えた:

  1. Bツリーインデックスと呼ばれる機能が組み込まれています。データの索引作成にこれを使用できますか?
  2. 私は時間チャネルでバイナリ検索を行い、チャネル値を読み取る必要があります
  3. 私は自分でインデックスを作成します(詳細挿入がある場合は常に更新します)。ここで使うのに最高のアルゴリズムは何でしょうか?

索引の主な動機は、高速な照会応答を持つことです。

ここで何をお勧めしますか?

答えて

2

最終的に自分で解決策を見つけました。最も簡単な方法は、hdf5ファイルを開いてデータチャネルを読み取る前に時間チャネルを読み込み、メモリマップを作成することです。このプロセスは、疎なハイパーグラフで時間チャネルを読み取ることによっても最適化することができます。

特定の時刻のインデックスがわかっている場合、データを読み取ることができます。

1

あなたは、単に一度解析されたデータを使用する方法について、HDF5ファイルからデータを解析する方法について尋ねていない.... class channel_data { ... };考える

と仮定すると、std::map<double, channel_data>ニーズに合わせなければなりません、具体的にはstd::map<>::lower_bound()およびstd::map<>::upper_bound()である。

+0

これはメモリインデックスの権利でしょうか?これはオプションではありません。私はたくさんのデータを持っています(毎日のテストでは500Mb /分)。 – schoetbi

+0

@schoetbi:必ずしもそうではありません。 'std :: map <>'はテンプレートパラメータとして、デフォルトでローカルフリーストアの観点から実装されるが、最終的にバッキングストレージの観点から実装されるアロケータクラスをとります。例えば。 boost.interprocessのメモリマップされたファイルをバッキングストレージとして使用するアロケータの実装を参照してください。 – ildjarn

+0

私はhdf5ファイル内のインデックスを持っていたいと思います。これも可能ですので、必要なときにいつでも再作成する必要はありませんか? – schoetbi

0

この問題を解決するための一般的なアプローチは、bitmap indexingを使用しているようです。これには書類もありますが、コードを公開していないようです。

関連する問題