2012-03-08 17 views
3

私はSQLiteの使い方に非常に重いアプリケーションを書いています。私は私のデータ(私の個人的なCore Data ...本質的に)を分類してフィルタリングすることを可能にするメモリキャッシングシステムを自分のアプリケーションに書き込んでいます。これは、SQLiteデータベースからの読み取り要求を絶えず行うよりも、これがより優れた/より高速なオプションであるように思えるからです。さらに、ほとんどのフィールド/列は検索可能/並べ替え可能となり、それぞれのインデックスを設定するのは理想的ではないようです。確信はないけど。私はSQLiteデータベースがメモリにキャッシュされていることを知っていますが、私にとってはどれくらいの利点があるのか​​分かりません。私自身のキャッシングシステムを実装することは複雑で、おそらく私はソート/フィルタを実行するためにメモリに完全に各テーブルをロードしているので、私のメモリフットプリントに追加するでしょう。私はそれが私のアプリのパフォーマンスを助けるならば、それをしたいと思っていますが、それは可能でしょうか?私がSQLiteのキャッシュに十分に頼っているだけですか、テーブルが大きくなる(10,000+行)ようになったときにはうんざりしますか?私は誰かがSQLiteの経験を十分に持っているかどうかを尋ねていると思います。SQLiteのキャッシングとアプリケーションのキャッシング

誰かが尋ねる前に:いいえ私はコアデータを使用できません。コアデータは私のアプリケーションで使用するのに十分柔軟ではありません。

+0

誰もいませんか?さて、私は自分のキャッシュを作るつもりです。とにかく興味深いプロジェクトになるでしょうし、少なくとも私は何が起こっているか知っています。 –

+0

'pragma locking_mode = exclusive' IIRCを使うと、sqliteは* much *速くなります。 –

答えて

1

これは私が想像したとおりです。その選択は、要件に大きく左右されます。私は、できるだけ多くのSQLiteキャッシュを削除し、必要なものをロードし、独自のルーチンを使用してソート/フィルタリングを終了しました。これは私にとって非常にうまく機能します。しかし、私はこれを実装することによって、これが多くの状況ではうまくいかないことに気づいた。具体的には、自分のDBサイズができるだけ小さいことを確認するために多大な努力をしました。私は基本的に単純な/小さいテキストと数字だけを保存しています。他のすべては外部ファイルへの参照です。これにより、データベースをデータベースとして使用するのに十分小さく、索引付けサービスとして使用することができます。これは、情報をメモリに読み込んでソート/フィルタリングするのに適しています。

したがって、答えはデータベースに大きく依存します。潜在的に大量のメモリを必要とする大きなフィールドを格納する場合は、おそらくSQLiteにキャッシュを処理させるのが最善の方法です。一方、フィールドが小さくなることが分かっている場合、SQLiteキャッシュはメモリを膨らませ、データの並べ替え/フィルタリングのためのデータベースへのラウンドトリップはレイテンシを増加させます。代わりに、並べ替え/フィルタリングを自分で行う方が良いですが、それは多くの作業だと私は認めます。しかし、それは私のアプリをDBにラウンドトリップするよりもずっと速くしました。

関連する問題