SQLiteはデータログの賢明なオプションですか?


8

Linuxで小さなデータロギングアプリケーションをセットアップしようとしています。データはシリアルポート経由で届き、そこからロギングとグラフィック表示に送られます。

ログ機能は、再起動後のグラフ機能の初期化のためにあります。

データは毎秒到着し、5桁の10進数の精度で構成され、2年間記録する必要があります。私の現在の空き容量は約15GBです。

これまでのプロジェクトの言語はbashとpythonです。

私の目的は、シンプルでありながら堅牢な(おそらくフラッシュドライブへのライブバックアップ?

SQLiteはこれに適していますか?私のホームディレクトリにあるテキストファイルはこれに適していますか?


7
ソフトウェアの世界には「最高」というものはありません。トレードオフしかない。
m3th0dman 2013

@Thijs van Dien、このコメントは答えである必要があります-受け入れられた答えではないにしても、それはシンプルであるため、少なくとも賛成票を投じる価値があります!
Vorac 2013

あなたの好きなように。:)
Thijs van Dien 2013

回答:


6

どちらのオプションも私には有効に思えます。このような場合、適用するのに役立つルールは、おそらく機能する最も単純なことを実行することです。テキストファイルは使い始めるのが簡単で、少なくとも最初はかなりうまく機能することが期待されています。データベースを使用してより十分に満足される要件が発生したら、それらをインポートすることは簡単です。この戦略を使用して、設計の決定を可能な限り延期します(それより長くはしない)。そのため、不要な作業は行いません。それが必要な場合でも、それが必要な場合は、それが正確に何である必要があるかについてはるかによく理解できます。したがって、正しいものを構築し、間違ったものを構築する時間を無駄にしない可能性が高くなります。


とても良いアドバイスです。経験から言えば、私は推測しています。ちょっと家にもヒットしました。
TheRealChx101

11

堅牢性と寿命の要件を考えると、プレーンな古いテキストファイルの方が適しています。他の人が指摘したように、データレートは高くありません。また、後処理はすべてロギングシステムからオフラインで行われるため、自由にデータを読み取ることができるため、最も効率的な方法でデータを書き込む必要がありません。

ファイルシステムはデータベース(退化したものです)であり、テキストファイルへの追加はシステムリソースに非常に負担がかかりません。勝てない

echo data >> mylogfile

最小限のシステムコールアクティビティ。また、テキストファイルは、内部の破損に対して、sqlite db、特にピクルファイルよりもはるかに堅牢です。

あなたのアプリケーションはリモートの無人センサーであり、どこかでオペレーターを呼ぶのが簡単ではないと思います。その場合、最も低い技術ソリューションが推奨されます。


単純なテキストファイルを使用するもう1つの良い点は、日ごとに分割した場合、同じ手法を使用して、cronジョブを使用して古いファイルを圧縮し、ディスク領域を節約できることです。このように
ピーターK.

そう、毎秒1行のテキストファイルです。シンプルで耐久性があり、拡張可能です(センサー/数量を追加した場合、それらは同じ行に追加されます)。ここに私のシステムのより一般的な議論があり、ここに作業中のソースコードがあります。機能している場合は、他の回答にスクリーンショット付きの回答を投稿します。
Vorac 2013

重要なのは、chattr + aを使用してコンテンツを上書きから効果的に保護することで、テキストファイルに追記専用モードのフラグを設定できることです。それはsqliteではできません。
フェデリコ

3

@gbjbaanbが指摘したように、SQLiteは「非常に多くのレコードを高速で挿入するようには設計されていません」。

私は1つの数/ 1秒ではないと言うだろう高いデータベース・オープンへの接続を維持した場合の速度。そしてそれはかなりうまくいくはずですが、ログは通常ファイルに作成されます、その解決策はより慣習的でおそらくそれゆえにエレガントです。

テキストファイルを使用し、毎月新しいファイルを作成します。HDDスペースに問題がある場合は、しばらくすると古いファイルを圧縮または削除できます。

場合は、「ログ機能は、再起動後に、グラフ機能の初期化の目的のためにそこにあります。」そしてあなただけの最後のn個の要素を持つ時間ウィンドウを必要とする、その後、あなたが追加することができfinally、あなたのコードと使用にブロックをpickleするdumpいくつかのデータ構造とload、再起動後にそれらを。ただし、その前に、再起動によって実際に必要なことを実行できることを確認してください。

これはおそらく、必要なリソースが少なく、要件により厳密に適合するソリューションです。


私はあなたの答えを非常に深く考えました。しかし、毎月新しいファイルを作成すると、プロジェクトに重要なロジックが追加されるという結論に達しました。したがって、1つのハッジファイルを使用することにしました。ただし、月1回アーカイブされますが、+ 1を差し上げます。
Vorac 2013

2

いいえ。SQLiteは優れたツールですが、非常に多くのレコードを高速で挿入するようには設計されていません。

ここでの最良の解決策は、素早く追加できるものであり、それはファイルです。そのようなファイルは好きな場所に置くことができ、Linuxでは通常/ var / logに置かれます(一部の管理者は/ varを別のパーティションに置くことを好むため、悪意のあるアプリが大量のデータを書き込んでもクラッシュしませんディスクがいっぱいになったときのOS)。

データが書き込まれると、ログファイルを読み取り、SQLite DBにインポートしてレポートに使用するツールを作成できます。

または、Nagiosなどの既存のツールを使用します。プラグインを作成し(ログファイルでデータを直接認識するようにプラグインを構成できない場合)、それをモニタリングとレポートに使用します。


毎秒1レコードが「高速」だと思いますか。
thorstenmüller2013

いいえ、本当ではありませんが、SQLiteはまだこのためのツールではありません。6300万件のレコードがあるテーブルの中央に挿入するのは、それほど速くはありません。テキストファイルは、より効率的なオプションです。
gbjbaanb 2013

0

はい。SQLiteは単なるバイナリファイルです。データベースに空のスケルトンを1度設定するだけで、そのバイナリファイルにデータを追加して「データベース」を埋めることができます。

以前の会社では、これをSymbian OS(c ++言語を使用)に実装し、ある種のロギングも行いました。残念ながら、これは少し前のことで、詳細を思い出せません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.