私は、非常に集中的な繰り返し読み取りと時折の書き込みを行う SQLite データベースを使用しています。ただし、書き込みは (インデックス付けのため) 読み取りをブロックする傾向があります。ディスク上のデータベースをメモリ内のデータベースに読み込み、マシンがおそらく 5 ~ 10 秒間完全にアイドル状態になったときに、ディスク上のデータベースに同期する方法が必要です。アタッチされたオンディスク データベースからインメモリ データベースにテーブルをコピーしたくなりましたが、もっと優れた方法があるはずです。また、マシンがアイドル状態のときにコミットされるトランザクションも考慮しました (ただし、これにより集中的な読み取りがブロックされます)。読み取りには、更新 (または挿入) されるテーブルが含まれますが、書き込みは時間の影響を受けません。
2 に答える
Write Ahead Logging を含む SQLite 3.7.0 以降にアップグレードする必要があります。この新しいロック方法により、書き込み中の読み取りが可能になります。
http://www.sqlite.org/draft/wal.html
インメモリ データベースとオンディスク データベースの間でコピーするには、バックアップ API を使用できますが、.NET ラッパーを通じてまだ公開されていません。
また、キャッシュ サイズを増やすことで、オンディスク データベースからインメモリ データベースと同じパフォーマンスを得ることができます。つまり、すべてをメモリにキャッシュできます。
もう 1 つのオプションは、同じ .NET ラッパーを含む SQLite フロント エンドを持ち、公式 SQLite リリースのドロップイン代替品である Oracle の新しいバージョンの BerkleyDB を使用することです。データベース レベルのロックの代わりにページ レベルのロックをサポートするようにロック メカニズムを変更し、同時実行性を大幅に改善したため、複数接続のパフォーマンスが向上しました。私自身は使っていませんが、良いものを読んでいます。
http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html
商用ライブラリがオプションの場合-http://www.devart.com/dotconnect/sqlite/を参照してください
(とりわけ)インメモリDBのサポートが付属し、基本的に説明したことを実行できるコンポーネントSQLiteDumpがあります... ADO.NET DataSet
/DataTable
サポート、LINQ、PLINQ、EFなども付属しており、サポートしています最新のSQListeバージョン...