2016-07-25 2 views
0
に達したときのsqlite3

私は組み込みデバイス(Linuxベース)にいくつかのログを保存するために2Mバイトの記憶領域を持っています。サイズが非常に限られているので、最大サイズに達した場合に対処するためのアプローチを実装する必要があります。 1つのオプションは、永続性のためのmmapを持つ循環バッファです。私たちが考えている他のオプションは、sqlite3を使用することです(最大サイズに達したときに最も古いエントリを削除し、新しいものを挿入する)。ディスクストレージが

私が理解する限り、sqlite3はページを使用します(4096Kまたは設定可能)。私の質問は次のとおりです:

  1. sqlite3からのディスク使用量の計算方法は?データベースのファイルサイズのほかに、ここで数えるために何が必要ですか?

  2. 2Mに達した場合はどうなりますか?最も古いエントリを削除するためにチェックできるエラーや特定の情報はありますか?

  3. エントリを削除して新しいエントリを挿入するのは良い方法です(パフォーマンス上の理由、データのセグメンテーション)。

ご意見やご意見は歓迎します。

答えて

1

ディスク使用量を計算することはできません。ファイルを監視する必要があります。実際のデータベースファイルのほかに、トランザクション内の変更されたデータの量に対応するロールバックジャーナルもあります。

ディスクがいっぱいになると、エラーコードSQLITE_FULL(または、OSによってはSQLITE_IOERR_WRITE)が表示されます。

PRAGMA max_page_countでデータベースサイズを制限できます。

削除された行は、その特定のデータベースページの空き容量を増やします。 (これは、VACUUMを実行しない限り、ファイルサイズを変更しませんでした) テーブルのもう一方の端に新しい行を挿入すると、すべての行が削除されたためページ全体が解放されたときにのみスペースが再利用できます。 可能であれば、大きな塊の行を削除しようとする必要があります。

+0

thanks.CL。私はエントリを複数回挿入して削除するためのループを作りました(それぞれ2M以上のsqlite_exec便宜関数で実行されます)。ファイルサイズが大きくなることが予想されます。しかし、それは変わりません。空き領域がVACCUMによって取り戻された場合、これは少し矛盾します。また、ロールバックジャーナルファイルはどこですか?私はディレクトリ内のデータベースファイルを見つけるだけです。 – pepero

+0

空き領域*は他の行で再利用できます。 VACUUMはファイルサイズに影響します。デフォルトの[設定](http://www.sqlite.org/pragma.html#pragma_journal_mode)では、トランザクションごとにロールバック・ジャーナルが削除されます。 –

+0

ええ、ロールバックジャーナルは一時ファイルです。分かりました。私はまた、挿入しようとしました。たとえば、サイズが82066432バイトのデータベースファイルになる2M行。次に、これらの行がすべて削除されます。ファイルサイズは縮小しません。 – pepero

関連する問題