2

いくつかのテレメトリ ストリームを保存する方法に苦労しています。私は多くのことで遊んできましたが、作家のブロックにいるような気がします。

問題の説明

UDP 接続を介して、さまざまなソースからテレメトリを受信します。各ソースは、一連のデバイスに分解されます。そして、デバイスごとに、保存したい最大 5 つの異なる値の型があります。それらは 1 分間に 1 回しか発生せず、まばらである可能性があります。値は、ハイブリッド エッジ/レベル トリガー方式で送信されます (値が十分に異なるか、十分な時間が経過したときに、値のデータを送信します)。つまり、時系列の辞書を備えた 2 レベルまたは 3 レベルの階層です。

私がデータで最もやりたいことは、a) 最新の値にアクセスし、b) タイムスパン (begin/end/value) を列挙することです。データ間の多くの「相関」はあまり気にしません。平均を計算したり、それらを相互に関連付けたりする必要はありません。一般に、特定のタイプの最新の値を、すべてまたは一部の階層派生サブセットにわたって調べます。または、1 つの値ストリームに焦点を当てて、スパンを列挙しています。

私はデータベースの専門家ではありません。実際、私はほとんど知りません。そして、私の 3 人の同僚もそうではありません。私はpythonをしています(そして、私がすることは何でもpython3にしたいです)。ですから、私たちが何をするにしても、できるだけ親しみやすいものにしたいと思っています. 私は現在、Mint Linux を使用して開発を行おうとしています。私はACIDなどについてはあまり気にしません。

これまでに行ったこと

  1. これの最初のバージョンでは、Gemstone Smalltalk データベースを使用しました。特殊化された Timeseries オブジェクトを構築するのは魅力的でした。私は多くの Smalltalk を行ってきましたが、同僚はそうではありませんでした。Gemstone システムは、単に「飛び込んですぐに満足する」だけのものではありません。そして、私たちは Smalltalk から離れたいと思っています (ただし、市場が別の方法で行ってくれることを願っています)。それで終わりです。

  2. RRD(ラウンドロビンデータベース)でプレイ。新しいアプローチですが、それほど悪い圧縮は必要なく、エッジ トリガーであるため、データ キャプチャ モデルではうまく機能しません。

  3. 友人が私に sqlite3 の使用を勧めました。私はこれをもう一度試すかもしれません。私の最初の試みはうまくいきませんでした。賢くなりすぎたのかもしれません。私は物事を「正規化された」方法でやろうとしていました。最初は問題なく動作していることがわかりました。しかし、デバイスのサブセットの特定のフィールドの「最新」の値を取得することは、(私にとっては)面倒な SQL になりつつありました。そして、その速度はちょっと残念でした。そのため、インデックス作成についても学ぶ必要があることがわかりました。入りたくない穴に入っていたことに気づきました。そして、Smalltalk DB を持っていた場所に戻りました。多くの専門知識があり、それを扱うことができるのは私だけでした。

  4. 「自作」の道を歩もうと思いました。私のデータは巨大ではありません。ディスクが安い。そして、ファイルの読み書きの方法をよく知っています。とにかく、ファイルシステムは階層データベースではありませんか? このプリミティブな手法に「知る人ぞ知る」と目を丸くしていると思いますが、この手法が一番親しみや​​すいものでした。少しの Python コードを使用して、構造化にディレクトリを使用し、各値に 2 つのファイル スキームを使用しました (1 つは最新の値用、もう 1 つは残りの値用の追加ログ)。これで問題なく動作しました。しかし、まだ完全に解決していないしわについては、私は責任を負いたくありません. データがシリアライズされる方法と同じくらい多くのコードが含まれます (現在は単純な文字列を使用しているだけです)。このアプローチの良い点の 1 つは、Python スクリプトを記述してデータを分析できる一方で、いくつかのことは、従来のコマンド ライン ツールで問題なく実行できます。例 (すべての最新の rssi 値を表示する単純なクエリ)。

    ls Telemetry/*/*/rssi | xargs cat

  5. 私は今朝、代替案を見て過ごしました。NOSQL サイトを拡大しました。PyTables を読んでください。スキャンされた ZODB チュートリアル。PyTables は、私が求めているものに非常に適しているようです。時系列をモデル化する名前付きテーブルの階層。しかし、PyTables はまだ python3 で動作するとは思いません (少なくとも、まだ python3 用の debian/ubuntu パッケージはありません)。ZODBについても同様です。残念ながら、多くの異なる NOSQL データベースが何をしているかについては、1 つを突き刺すことすらできません。

アイデア募集

これが始まったときよりも、私は当惑し、混乱していることに気づきました。私はおそらくあまりにも素朴だったので、もう少し「火をつけて忘れる」ことができる何かを見つけて、この時点でそれを乗り越えることができませんでした. アドバイスやご指示をいただければ幸いです。莫大なオーバーヘッド/教育/侵入なしで私のニーズを満たすことができるレシピを誰かが私に与えることができれば、私はそれを答えとして確実にマークします.

4

4 に答える 4

2

わかりました、私はこれを突き刺すつもりです。

多くの非構造化データに Elastic Search を使用しています: http://www.elasticsearch.org/。私はこのテーマの専門家ではありませんが、日常生活では指数に大きく依存しています。基本的に、JSON オブジェクトをインデックスに投稿します。インデックスはサーバー上にあります。URL を介して、または適切な場所に JSON オブジェクトを投稿することによって、インデックスをクエリできます。私はpyelasticsearchを使用してインデックスに接続します.---そのパッケージは十分に文書化されており、使用するメインクラスはスレッドセーフです.

クエリ言語自体は非常に堅牢ですが、レコードを投稿する前に、「最新の時間」であるインデックス内のレコードにフィールドを簡単に追加できます。

とにかく、私はこれがチェックマークに値するとは思わない (あなたがそのルートに行ったとしても) が、コメントするには長すぎた.

于 2013-07-26T22:31:07.570 に答える
0

あなたの問題は技術的なものではなく、問題の仕様が不十分です。

センサーデータで何かをしている場合、古い実験室の格言が適用されます。「書き留めなければ、それは起こらなかった」. ラボではノートとペンを意味し、コンピューターでは ACID を意味します。

また、すべての悪の根源であることがよく知られているソリューションを時期尚早に最適化しているようです。データのサイズはわかりませんが、「1分に1回以上速くならず、まばらかもしれません」と言います。サイズが 1.0KB であると仮定すると、1 日あたり 1.5MB または 1 年あたり 5.3GB になります。私の StupidPhone には、あなたが 1 年で必要とするよりも多くのストレージがあり、私のラップトップにはより大きなくしゃみがあります。

最大の問題は、あなたがデータベースについて「ほとんど知らない」と主張していることであり、それが問題の核心です。あなたのデータは、標準的な古い 1950 年代のデータ処理の退屈なものです。SQLite に質問する方法さえ知っていれば、SQLite が必要なすべてのことを実行するとき、流行語のストレージ テクノロジに飛び込んでいます。Smalltalk DB がダウンしていることを考えると、必要な従来の RDBM 原則をすべて学習し、さらにいくつかを学習するのに 1 日以上の研究が必要だったとしたら、私は非常に驚かれることでしょう。

その後、一般論以上に答えられる質問を書けるようになります。

于 2013-07-26T23:09:19.497 に答える