2009-04-21 11 views
5

私はarm9組み込みLinuxプラットフォームでsqliteデータベースを使用しています。私はディスクがフラッシュメモリで最小書き込みサイクルが必要なため、ディスクデータベースへの書き込みを減らしたい。そこで私はSQLite_DEFAULT_CACHE_SIZEを5000に増やそうとしました。私の目的は、キャッシュにデータを書き込むことと、キャッシュがいっぱいになるとディスクに自動的にフラッシュすることでした。しかし、SQLITE_DEFAULT_CACHE_SIZEをインクリメントすることで、これが動作しているかどうかを確認することはできません。私は操作の変更を見ていない!私の道は正しいのですか?誰か私にいくつかの提案を与えることができますか? おかげ Aneeshデータベースへのフラッシュを制限する方法は?

+0

あなたの要件を理解しているかどうかわかりません。通常、トランザクション保証を保証するためにデータベースが使用されます。これを行うには、データベースがディスクに書き込む必要があります。状態の変更が重要ではない場合は、なぜデータベースを更新する必要がありますか?状態の変更をメモリに保持し、変更を永続化する必要がある場合にのみデータベースを更新することができます。その場合、ディスクを打つことは設計上避けられないものです。 – lothar

+1

通常は常にそうではありません。 sqliteは、一時的な記憶機構として多くのエキゾチックな環境で使用されます。たとえば、電話機のリモートデータのキャッシュ - キャッシュがなくなると、いつでも再構築できますが、遅くなります。その場合、私はそれを速くしたい、そしてそれが壊れているかどうかを知りたい。しかし、私の店が無効であることが分かっている限り、腐敗はOKです。私は時折それを捨てることができます。 –

答えて

2

最新SQLite has a feature for backing up hot databasesそれはまだ実験的ですが、私の推薦は、メモリー・データベース上で使用して、適切であると考えたときに、ディスクのデータベースにマージすることです。

+0

はいロバートは正しいですが、問題は、データベースを定期的にフラッシュする必要があります。それはあまりにも危険であるようです。私の意図は、Sqliteがキャッシュフルに基づいたデフォルトのフラッシュをサポートしているかどうかです。 上記のシナリオに基づいて、上記のシナリオに基づいていくつかの実験を行いました。 PRAGMA journal_mode = MEMORY、PRAGMA SQLITE_DEFAULT_CACHE_SIZE = 5000、PRAGMA synchronous = FULL、 フラッシングレートは2000(デフォルト)と5000のキャッシュサイズで似ているようです私は不思議に思っています。 –

+0

残念ながら、これらのオプションは、あなたが完全なキャッシュにRAMからデータをフラッシュするための基準として使用することができない、ということ言っている 、それはドライブあなたvalubleの提案のためのすべての感謝の –

+0

ファーストを打つだろうれる速度には影響しませんディスクファイル?それがある場合、私の問題は、任意のリスク要因を解決する可能性があります。あなたは示唆する他のオプションがありますか? 高度なおかげで、 Aneesh –

-1

あなたはSQLiteのソースコードがある - それはあなたが興味のある情報を記録するために、なぜ単に楽器を

+0

ええ...それは簡単です! – tylerl

+0

詳細を教えてください、私はあなたの提案を理解していない!!!! –

+0

うーん、この答えは私の知る限り理解と全く無関係である... SQLiteのコードの中でいくつかの点で –

0

[OK]をニール.IFにし、「SQLiteのは、ライトスルーキャッシュの形式を使用しています」。キャッシュオーバーフロー、それはいくつかの一時ファイルやディスクファイルにデータをフラッシュしようとします。これは私がキャッシュサイズをenalrgingで実験していると同じポイントですので、フラッシングレートを制御を取得します。しかし、それは起こっていません。 。

+0

を低く答えましたが、あなたはおそらくこれを尋ねるためにあなたの元の質問を変更する必要があります。第2に、ライトスルーキャッシュとは、すべての書き込みがただちにディスクにコミットされることを意味しますが、書き込まれたデータもキャッシュに保持されます。したがって、キャッシュサイズはディスクへの書き込み頻度にほとんどまたはまったく影響しません。私が言ったように、私はこれが起こっていることを100%確信することはできません - あなた自身でコードを見てください。 –

2

すべてのコミットでSQLiteをACID dbにするか、すべての挿入/削除/更新をトランザクションでラップしないでください。グループ化操作にトランザクションを使用するか、ACIDityをオフにしてPRAGMA synchronous = OFFに設定します。

「プラグマ同期= OFF」とSQLiteは、すべてのフラッシュのデータが

SQLITE_DEFAULT_CACHE_SIZEはONLYキャッシュのサイズのためである(効果的にOSのキャッシュにすることを残して)はありません。また、キャッシュはデータの読み取り専用です。

別のオプションがあります。独自のVFSレイヤを実装して、自分のバッファがいっぱいになる前にページを保存しないようにすることもできます。 http://www.sqlite.org/c3ref/vfs.html

しかし、私はsync = off(またはトランザクションを使用するほうが良い)で十分な仕事をしていると確信しています(停電の場合にデータベースを破損する可能性があります) 。

別のヒントは、JOURNALをメモリに置くか完全にオフにすることです。もう一度 - それは酸性度をオフにしていますが、それもディスクのタッチを取り除きます。

+0

私は同意します。トランザクション構造はおそらく最大の利益が見出される場所です。 –

関連する問題