1

Raspberry Pi を使用して気象観測所を作成しています。さまざまなセンサー (温度、湿度、圧力、雨など) 用に mySQL データベースをセットアップしており、風センサーの処理に取りかかっています。

風速計の GPIO ピンを監視し、パルスをカウントして風速を計算する Python プログラムがあります。また、ADC を介して風向計プロセスから読み取り、方向を取得します。他のセンサーについては、数分ごとに処理し、データを直接 DB にダンプします。風センサー データから多くのことを計算する必要があるため、必ずしも 5 秒ごとに DB に書き込み、現在の速度と方向を計算するために過去 5 分間のデータを読み戻す必要はありません。データをメモリに集めて加工し、確定したデータをDBに書き込みたい。センサーの読み取り値は次のようなものです。

日時、速度、方向
2013-6-20 09:33:45, 4.5, W
2013-6-20 09:33:50, 4.0, SW
2013-6-20 09:33:55, 4.3, W

プログラムは、風センサーから 5 秒ごとにデータを計算しています。5分ごとにDBにデータを書き込みたいです。DB は SD カード上にあるため、DB に 60 回書き込み、それを読み込んで処理し、5 分ごとに永続的なアーカイブ DB に書き込むことは明らかにしたくありません。

リストのリストを使用したほうがよいでしょうか? それとも日時をキーにしたタプルの辞書ですか?
{datetime.datetime(2013, 6, 20, 9, 33, 45, 631816): ('4.5', 'W')}
{datetime.datetime(2013, 6, 20, 9, 33, 50, 394820): ('4.0', 'SW')}
{datetime.datetime(2013, 6, 20, 9, 33, 55, 387294): ('4.3', 'W')}

後者の場合、辞書を更新する最良の方法は何ですか? それをDBにダンプして読み返すだけですか?非常に少ないデータに対して、1 日の読み取り/書き込みの量が多すぎるように思えます。

4

3 に答える 3

1

Python プログラムとデータベースの間には複数のキャッシュ層があります。特に、Linux ディスク ブロック キャッシュは、使用パターンによってはデータベースをコアに保持する場合があります。したがって、データベースへの書き込みと読み取りが、アプリケーションに配置する自作のキャッシュよりも必ずしも遅いと想定しないでください。また、DB を時期尚早に最適化するために作成したコードは、作成していないコードよりもはるかにバグが多くなります。

あなたが指定したワークロードの場合、MySQL は SQLite に比べて少し重いと思いますが、それを必要とする理由は述べられていないかもしれません。

于 2013-06-20T16:19:10.710 に答える
0

1 つのオプションは、redisを使用してデータを保存することです。これは、あなたが話しているようなデータを格納するのに非常に適したキー バリュー ストアです。メモリ内で動作し、永続化のためにデータをディスクに書き込みます。これは構成可能であるため、数時間ごとまたは 1 日に 1 回だけディスクに書き込むように設定できます。redis -pyライブラリは非常に使いやすいです。

于 2013-06-20T16:08:41.487 に答える
0

私の一般的な経験では、日時をキーとする辞書を使用する方が簡単です。リストのリストは、すぐに非常に混乱する可能性があります。

ただし、辞書を更新する最善の方法はわかりません。私のPythonが錆びている可能性がありますが、DBにダンプして読み返すのは少し冗長であるように思えます. プログラム内の変数にダンプできる方法はありますか?

そうでない場合は、DB にダンプして読み返すことが唯一の選択肢かもしれませんが、私の Python は少し錆びています。

そうは言っても、私はProgrammaticus Takeitovericusにはなりたくありませんが、データ ストレージ用の XML を調べたことがありますか? データベースよりも操作が簡単で、読み取りと書き込みがはるかに少ないことがわかったので、最終的にデータベースに切り替えました。あなたのプロジェクトの仕様がわからないので、この提案はまったく無意味かもしれません。

于 2013-06-20T16:09:51.260 に答える