2012-04-02 5 views
23

私は、時系列のインデックス作成に使用されるベストブライドデータ構造についての意見を仲間のSOに質問したいと思います(別名列データ、別名フラットリニア)。極端に長い時系列のベストオブブライドインデックスデータ構造

時系列の2つの基本タイプがサンプリング/離散特性に基づいて存在する:

  1. レギュラー離散化(各サンプルは、共通の周波数で撮影されている)

  2. 不規則な離散化(試料を採取します必要になりますarbitaryの時点で)

クエリ:

  1. 時間範囲内のすべての値[T0、T1]

  2. 時間で

  3. V0よりも小さい/大きい時間範囲内のすべての値[T0、T1]のすべての値値の範囲内にある範囲[T0、T1] [V0、V1]

データセットは、(ソートの不規則な離散乗り越え)要約時系列から成り、および多変量の時系列。問題のデータセットは約15-20TBの大きさなので、処理は分散して実行されます。前述のクエリの中には、1つのシステムで使用可能な物理メモリの量より大きなデータセットが存在するためです。

分散処理とは、必要なデータ固有の計算を時系列問合せと一緒にディスパッチすることで、可能な限りデータに近い計算ができるようにすることです。 map/reduceパラダイムに似ています) - 計算とデータの距離が近いことは非常に重要です。

索引で対処できるもう1つの問題は、圧倒的多数のデータが静的/歴史的(99.999 ...%)であることです。ただし、毎日新しいデータが追加され、「フィールド・セネクター」または「市場データ」と呼ばれます。アイデア/要件は、可能な限り低いレイテンシで実行中の計算(平均、garchなど)を更新できるようにすることです。これらの実行中の計算の一部は履歴データを必要とし、そのうちのいくつかは合理的にキャッシュできるもの以上になります。

私はすでにHDF5と考えていますが、より小さなデータセットでは効率的に動作しますが、データセットが大きくなるにつれてドラッグを開始します。フロントエンドからのネイティブ並列処理機能もありません。

さらに、提案、リンク探しなど(CまたはC++のソリューション、ライブラリ)

+0

タイプ1〜3のクエリは、「直交範囲レポート」と呼ばれることがよくあります。 – oldboy

+0

http://dba.stackexchange.com/questions/16583/using-an-rdbms-for-querying-tenth-of-terabytes-of-time-series-data –

+7

@Martin:ありがとうございますが、すべてが爪のように見えるということだけがハンマーを持っているということです。高度にdb/dba指向のQ/Aサイトでこのような質問をすると、わずかな偏りで答えが出ます。 –

答えて

0

一般的なアイデア読み:

問題1はかなり一般的である:あなたのRAMに収まるとリンクしているインデックスを作成します。 (データ構造:B-Tree family)に転送します。 問題2/3はデータが非常に大きいので非常に複雑です。データを時間範囲に分割し、その時間範囲の最小/最大を計算することができます。その情報を使用して、時間範囲を除外することができます(たとえば、範囲の最大値は50、v0> 60を検索して間隔が終了するなど)。残りは、データを調べることによって検索する必要があります。その有効性は、データの変化の速さに大きく依存します。

低レベルの時間範囲を組み合わせて複数のインデックスを作成して、フィルタリングを高速化することもできます。

+2

時系列でb-tree構造を使用する際の問題は、ほとんどの時系列モデルが離散的な意味で '連続'値をモデル化していることです。例:30度の部屋の温度は25に低下する必要があり、20に達する前にbツリーはそのような洞察を使用しないため、時系列のインデックス付けには不向きです。問題1の –

+0

、あなたのコメントは私には意味がありません。温度が30度のすべてのポイントを時間内に検索したい場合は、データを取得しただけでなく、インデックスを作成する必要があります。問題2と3に関して、私は矛盾は見ません。実際にはデータが連続していると仮定します。それ以外の場合は、データが間に入っていないと判断するために最小値/最大値で作業します。 –

+0

元のコメントをお読みください。過去に似たようなデータを扱っていれば意味があるはずです。 –

10

大規模でバランスのとれたツリーを使用することをお勧めします。言及したTobiasのように、Bツリーは最初の問題を解決するための標準的な選択肢になります。また、高速挿入や更新を気にする人は、MITやCMUのような場所で、新しい「キャッシュを知らないBツリー」に多くの新しい作業が行われています。これらのものの実装のいくつかの議論については、Tokutek DBを見て、彼らは次のように優れたプレゼンテーションの数を持っている:彼らは関与するので

http://tokutek.com/downloads/mysqluc-2010-fractal-trees.pdf

質問2と3は、多くの困難一般的ですより高い次元範囲の探索。これを行うための標準的なデータ構造は、O(log^d(n))のコストでO(log^{d-1}(n))クエリ時間を与えるrange treeです。あなたは一般的にではありません。はこのようなもののためにk-dツリーを使いたいと思っています。 kdツリーに最適なO(n)のストレージコストがあるのは事実ですが、範囲クエリをO(n^{(d-1)/ d})より速く評価することはできませんO(n)ストレージを使用してください。 d = 2の場合、これはO(sqrt(n))時間の複雑さになります。 10^10データポイント(O(10^5)ディスクの読み込みが単純な範囲のクエリで完了するのを待っている人は誰ですか?)

幸いにも、あなたの状況は、あなたが本当に一般的なケースについてあまり心配する必要はありません。すべてのデータは時系列から得られたものなので、時間座標ごとに最大で1つしか値がありません。仮説的には、範囲問合せを使用してある間隔の間隔を引いてから、ポスト・プロセスが通過してv制約をポイントワイズに適用するだけです。これは私が(良いデータベース実装を得た後に)しようとする最初のものであり、それがうまくいくならあなたは完了です! [t0、t1] x [-infty、+ infty]の点の数が[t0の点の数よりも桁違いに大きい状況に陥っている場合は、後の2つのクエリを最適化することが実際には理にかなっています、t1] x [v0、v1]である。

+0

一方、2,000ドル相当のハードディスク(今日の価格では20TB *約100ドル/ TB)から80,000ドルまでの記憶手段に余分な対数係数を使用します(big-O定数を仮定しない)。プログラマーコストの1年足らずで、これはそれに値するかもしれませんが、マネージャーがそのように物事を見ることができれば幸運です。 – oldboy

+1

@mikola:本当に面白い!モデル化されている価値の固有の価値構造を利用する時系列索引付け構造は一見価値があります。 –

0

あなた自身でこれを実装するには、本当に時間がかかり、複雑になるでしょう。カッサンドラを使うことをお勧めします。 Cassandraは、水平スケーラビリティ、冗長性を提供し、複雑なマップリダクション機能を将来実行することを可能にします。 時系列をcassandraに保存する方法については、 http://www.datastax.com/dev/blog/advanced-time-series-with-cassandra およびhttp://www.youtube.com/watch?v=OzBJrQZjge0をご覧ください。

+4

基本的な要件、レイテンシとデータサイズを考慮すると、管理されるものは明らかに不足します。 –

関連する問題