いくつかの非常に大量の時系列データを保存し、クエリできるようにする必要があります。
データのプロパティは次のとおりです。
- シリーズ数:約12.000(1万)
- データポイントの数、グローバル:1か月あたり約500.000.000(5億)
- 混合値タイプ:データポイントの大部分は浮動小数点値で、残りは文字列です
- サンプリング期間:シリーズ間およびシリーズ内で可変
- タイムスタンプ:ミリ秒精度
- データ保持期間:数年、減衰またはダウンサンプリングなし
- データアーカイブはほぼリアルタイムで構築する必要がありますが、妥当な遅延(約1時間)が許容されます
- 必要に応じて過去のデータを再構築できますが、高コストです
- 時々ですが、ごくまれに、過去のデータを更新する必要があります
想定されるクエリのプロパティ:
- データに対するクエリのほとんどはタイムスタンプベースのクエリです。1日から数ヶ月/年までの範囲。90%以上が最新データのクエリになります
その他の要件:
- ソリューションは、無料のビールのように無料である必要があり、できればオープンソース
私が最初に考えたのは、SQLデータベースの代わりにバックエンドを格納するHDF5ファイルで PyTables / Pandasを使用することでした。
質問:
PyTables / Pandasが「最良の」ルートであると仮定すると、それぞれが特定の期間にわたる複数のHDFファイルにデータを分割するか、すべてが単一のファイルに入れられて巨大になるのが良いでしょうか?
固定形式または表形式を選択する必要がありますか?私にとっては、1か月に1つのHDFファイルを保持すれば、固定形式は問題なく見えます。このように、シリーズ全体がおそらくRAMに収まり、テーブル形式インデックスを必要とせずにメモリ内をスライスできるからです。私は正しいですか?
それが最善のアプローチではない場合、このデータストアをどのように構成する必要がありますか、またはどのテクノロジーを検討する必要がありますか?大量の時系列データの保存に取り組むのは私が初めてではありませんが、この課題を解決する一般的なアプローチは何ですか?
私が検討した他のアプローチ:
- 配列データベース:配列の開始時間と終了時間、およびサンプリング周期を保存するだけでよく、配列自体の値とインデックス付けが簡単なので、一定のサンプリング周期を持つ時系列に最適です。しかし、シリーズ自体の可変サンプリング期間では、タイムスタンプと値の関係をより厳密に保つ必要があります。これは、私の見解では、配列DBMSにはあまり適していません。
- タイムスタンプ、paramID、値を列として持つ標準SQLデータベースですが、その性質上、クエリに対して大量のディスクI / Oを要求します