2011-08-16 12 views
4

私はアプリケーションのsqliteをキャッシュの一種として使用しようとしています。私はアイテムが私のキャッシュから期限切れにならず、何も保管していないので並べ替えと言っています。前に処理したすべてのIDをキャッシュに格納するだけで済みます。私は何かを何度も処理したくない。SQLite .Netパフォーマンス

私は10,000個のメッセージ/秒でキャッシュにアイテムを入力しており、合計1億5,000万メッセージになります。私のテーブルはかなりシンプルです。それはidを格納するテキスト列を1つしか持たない。私は辞書を使ってメモリ上でこれ​​をすべて実行していましたが、私は何百万というメッセージを処理していますが、そのように高速ですが、しばらくしてメモリが不足しました。

私はsqliteとパフォーマンスについて研究しましたが、設定が重要だと私は理解していますが、私はまだインサートでは恐ろしいパフォーマンスを得ています(まだ選択しませんでした)。私は5000インサート/秒で追いつくことができません。たぶんこれはそれが得られるほど良いです。

私の接続文字列は以下の通りである:あなたが提供することができます任意の助け

Data Source=filename;Version=3;Count Changes=off;Journal Mode=off; 
    Pooling=true;Cache Size=10000;Page Size=4096;Synchronous=off 

ありがとう!

答えて

5

一度にたくさんの挿入や更新を行っている場合は、それらをトランザクションに入れてください。

また、本質的に同じSQLを実行する場合は、パラメータ化された文を使用します。

SQLite Optimization FAQ(少し古い)を見ましたか?

SQLite performance tuning and optimization on embedded systems

+0

ありがとうございます...はい私はトランザクションを使用していますが、毎回新しいものを作成しています。私はまた、パラメータ化されたステートメントを使用しています。 –

1

同じデータベースへの書き込み多くのスレッドを持っている場合は、毎秒、多くのトランザクションと並行性の問題に実行するつもりです。 SQLiteは常にデータベース全体をロックして書き込みを行うため、一度に1つの書き込みトランザクションしか処理できません。

代わりに、SQLiteを使用したOracle Berkley DBがあります。この最新バージョンのBerkley DBには、データベースレベルではなくページレベルのロック機構を持つSQLiteフロントエンドが含まれています。これにより、並行処理の要件が高い場合には、1秒あたりのトランザクション数が非常に多くなります。

http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html

は同じSQLite.NETプロバイダを含み、ドロップイン置換であると考えられます。

0

あなたは要件が非常に細かいので、memcachedのような専用のものを使う方が良いかもしれません。これは、単純なハッシュテーブルよりもはるかにメモリ効率が良い非常に高いスループットのキャッシュ実装を提供します。

Is there a port of memcache to .Net?

関連する問題