7

データ取得のためのシステムを構築しています。取得したデータは通常、15 個の信号で構成され、それぞれが (たとえば) 500 Hz でサンプリングされます。つまり、毎秒約 15 x 500 x 4 バイト (signed float) が到着し、永続化する必要があります。

以前のバージョンは、データ ストレージに DB4O データベースを使用して .NET (C#) 上に構築されていました。これはかなり効率的で、うまく機能しました。

新しいバージョンは Linux ベースで、Python (またはおそらく Erlang) を使用し、... はい! 適切なストレージ候補は何ですか?

私は MongoDB を考えており、各サンプル (または実際にはそれらの束) を BSON オブジェクトとして保存しています。各サンプル (ブロック) には、キー (インデックス付き) フィールドとしてのサンプル カウンターと、信号源の識別情報があります。

問題は、サンプルをかなり迅速に取得できなければならないことです。要求された場合、サンプル カウンター範囲と要求された信号ソースを使用して、最大 30 秒のデータを 1 秒未満で取得する必要があります。現在の (C#/DB4O) バージョンは、この OK を管理し、100 ミリ秒未満でデータを取得します。

Python がパフォーマンス面で理想的ではないかもしれないことはわかっていますが、それについては後で説明します。

システム (「サーバー」) には複数の取得クライアントが接続されるため、アーキテクチャは適切に拡張する必要があります。

編集: さらに調査した後、おそらくサンプルデータにはHDF5を使用し、ドキュメントのような情報にはCouchまたはMongoのいずれかを使用します。お知らせします。

編集: 最終的な解決策は、HDF5 と CouchDB に基づいていました。Python で実装され、Raspberry Pi で実行され、問題なく動作しました。

4

3 に答える 3

4

HDF5の使用を調べることができます... ストリーミング データ用に設計されており、時間インデックス付きのシークが可能で、(私の知る限り) Python で十分にサポートされています。

于 2012-10-30T18:52:37.963 に答える
2

説明したキーを使用すると、必要に応じてシャーディングを介してスケーリングできるはずです。120kB / 30sec はそれほど多くないので、あまり早くシャードする必要はないと思います。

ファイルのみを使用する場合と比較すると、より高度なクエリが得られ、高可用性、DS、またはオフライン処理 (Map Reduce など) のためのレプリケーションが組み込まれます。

于 2012-10-30T16:33:53.113 に答える
-1

あなたの場合、15 個のファイルを作成し、各サンプルを対応するファイルに順番に保存できます。これにより、要求されたサンプルがディスクに連続して保存されるようになり、読み取り中のディスク シークの回数が減ります。

于 2012-10-27T17:02:39.770 に答える