いくつかのテレメトリ ストリームを保存する方法に苦労しています。私は多くのことで遊んできましたが、作家のブロックにいるような気がします。
問題の説明
UDP 接続を介して、さまざまなソースからテレメトリを受信します。各ソースは、一連のデバイスに分解されます。そして、デバイスごとに、保存したい最大 5 つの異なる値の型があります。それらは 1 分間に 1 回しか発生せず、まばらである可能性があります。値は、ハイブリッド エッジ/レベル トリガー方式で送信されます (値が十分に異なるか、十分な時間が経過したときに、値のデータを送信します)。つまり、時系列の辞書を備えた 2 レベルまたは 3 レベルの階層です。
私がデータで最もやりたいことは、a) 最新の値にアクセスし、b) タイムスパン (begin/end/value) を列挙することです。データ間の多くの「相関」はあまり気にしません。平均を計算したり、それらを相互に関連付けたりする必要はありません。一般に、特定のタイプの最新の値を、すべてまたは一部の階層派生サブセットにわたって調べます。または、1 つの値ストリームに焦点を当てて、スパンを列挙しています。
私はデータベースの専門家ではありません。実際、私はほとんど知りません。そして、私の 3 人の同僚もそうではありません。私はpythonをしています(そして、私がすることは何でもpython3にしたいです)。ですから、私たちが何をするにしても、できるだけ親しみやすいものにしたいと思っています. 私は現在、Mint Linux を使用して開発を行おうとしています。私はACIDなどについてはあまり気にしません。
これまでに行ったこと
これの最初のバージョンでは、Gemstone Smalltalk データベースを使用しました。特殊化された Timeseries オブジェクトを構築するのは魅力的でした。私は多くの Smalltalk を行ってきましたが、同僚はそうではありませんでした。Gemstone システムは、単に「飛び込んですぐに満足する」だけのものではありません。そして、私たちは Smalltalk から離れたいと思っています (ただし、市場が別の方法で行ってくれることを願っています)。それで終わりです。
RRD(ラウンドロビンデータベース)でプレイ。新しいアプローチですが、それほど悪い圧縮は必要なく、エッジ トリガーであるため、データ キャプチャ モデルではうまく機能しません。
友人が私に sqlite3 の使用を勧めました。私はこれをもう一度試すかもしれません。私の最初の試みはうまくいきませんでした。賢くなりすぎたのかもしれません。私は物事を「正規化された」方法でやろうとしていました。最初は問題なく動作していることがわかりました。しかし、デバイスのサブセットの特定のフィールドの「最新」の値を取得することは、(私にとっては)面倒な SQL になりつつありました。そして、その速度はちょっと残念でした。そのため、インデックス作成についても学ぶ必要があることがわかりました。入りたくない穴に入っていたことに気づきました。そして、Smalltalk DB を持っていた場所に戻りました。多くの専門知識があり、それを扱うことができるのは私だけでした。
「自作」の道を歩もうと思いました。私のデータは巨大ではありません。ディスクが安い。そして、ファイルの読み書きの方法をよく知っています。とにかく、ファイルシステムは階層データベースではありませんか? このプリミティブな手法に「知る人ぞ知る」と目を丸くしていると思いますが、この手法が一番親しみやすいものでした。少しの Python コードを使用して、構造化にディレクトリを使用し、各値に 2 つのファイル スキームを使用しました (1 つは最新の値用、もう 1 つは残りの値用の追加ログ)。これで問題なく動作しました。しかし、まだ完全に解決していないしわについては、私は責任を負いたくありません. データがシリアライズされる方法と同じくらい多くのコードが含まれます (現在は単純な文字列を使用しているだけです)。このアプローチの良い点の 1 つは、Python スクリプトを記述してデータを分析できる一方で、いくつかのことは、従来のコマンド ライン ツールで問題なく実行できます。例 (すべての最新の rssi 値を表示する単純なクエリ)。
ls Telemetry/*/*/rssi | xargs cat
私は今朝、代替案を見て過ごしました。NOSQL サイトを拡大しました。PyTables を読んでください。スキャンされた ZODB チュートリアル。PyTables は、私が求めているものに非常に適しているようです。時系列をモデル化する名前付きテーブルの階層。しかし、PyTables はまだ python3 で動作するとは思いません (少なくとも、まだ python3 用の debian/ubuntu パッケージはありません)。ZODBについても同様です。残念ながら、多くの異なる NOSQL データベースが何をしているかについては、1 つを突き刺すことすらできません。
アイデア募集
これが始まったときよりも、私は当惑し、混乱していることに気づきました。私はおそらくあまりにも素朴だったので、もう少し「火をつけて忘れる」ことができる何かを見つけて、この時点でそれを乗り越えることができませんでした. アドバイスやご指示をいただければ幸いです。莫大なオーバーヘッド/教育/侵入なしで私のニーズを満たすことができるレシピを誰かが私に与えることができれば、私はそれを答えとして確実にマークします.