4

SQLite データベースを作成しました (~700MB、3 つのテーブル、3 つのインデックス - 1 つの rtree インデックスと 2 つの主キー)。読み取り専用ファイルとしてマークしました (Windows 上)。

複数のスレッドからこのデータベースに対して SELECT コマンドだけを実行することは、安全で効率的ですか?

もしそうなら、どうすればパフォーマンスを向上させることができますか (有効にするオプションやフラグ、小さな調整など)?

このアプリケーションは、System.Data.SQLite (1.0.82.0) を使用して C# で作成され、x64 マシン上の .NET 4.0 用にコンパイルされています。そして、それは正常に動作します(私はそれらを証明できない/知らないため、必ずしもパフォーマンスが高い、または正しく並列化されているとは限りません)。現在、本当のボトルネックはありませんが、すぐにボトルネックになります! できるだけ早く rtree を検索する必要があります。(私のマシンでは 4GB、2 コア) rtree の検索に 5 ミリ秒以上かかることがあります。データを並列処理するために、その部分をマルチスレッド化しました。また、 R-Tree (または SQLite の場合は R*-Tree だと思います)の構造によれば、データベースが数 GB に成長しても、これらのツリーは深さが浅く、大規模なデータセットで高速であるため、問題はありません。ただし、改善が可能な場合は、このアプリケーションで検討する必要があります。

並列化された部分が実際に並列で実行されているかどうかはわかりません。たとえば、SQLite (または System.Data.SQLite) には内部ロックがありません。実際、一部のテストでは、並列バージョンの方が実行速度が遅くなります!

4

3 に答える 3

4

各スレッドに独自の接続がある場合、またはロックを使用して複数のスレッドが同時に同じ接続を使用しないようにする場合、これは安全です。

于 2012-12-27T19:56:41.993 に答える
3

複数のスレッドからこのデータベースに対して SELECT コマンドだけを実行することは、安全で効率的ですか?

最も可能性が高い

どうすればパフォーマンスを向上させることができますか (可能な場合)?

ボトルネックは何ですか? ディスク I/O? プロセッサー?メモリー?

アプリケーションのパフォーマンスを向上させるには、1) パフォーマンスが低下している (および改善できる) 部分を特定し、2) それらの部分のパフォーマンスを向上させることが最善の方法です。コードの最も遅い部分を特定して、最初に何に取り組むべきかがわかるようにするツールが多数あります。プログラムがクエリの結果を取得し、それをディスクに書き込むのに 10 秒を費やす場合、クエリから 10 ミリ秒を削っても意味がありません。

アプリケーション (特にデータベース駆動型アプリケーション) に手を振って実行を高速化できる「魔法の杖」はありません。最初に何を修正すべきかを知る必要があります。

于 2012-12-27T20:00:22.517 に答える
1

スレッド サポート レベルを設定できます: http://www.sqlite.org/threadsafe.html

SQLite は 3 つの異なるスレッド モードをサポートしています。

シングルスレッド。このモードでは、すべてのミューテックスが無効になり、一度に複数のスレッドで SQLite を使用するのは安全ではありません。

マルチスレッド。このモードでは、1 つのデータベース接続が 2 つ以上のスレッドで同時に使用されない限り、SQLite を複数のスレッドで安全に使用できます。

シリアライズ。シリアル化モードでは、SQLite を複数のスレッドで制限なく安全に使用できます。

スレッド モードは、コンパイル時 (SQLite ライブラリがソース コードからコンパイルされるとき)、開始時 (SQLite を使用するアプリケーションが初期化されるとき)、または実行時 (新しい SQLite データベースが作成されるとき) に選択できます。接続が作成されています)。一般的に言えば、実行時は開始時間をオーバーライドし、開始時はコンパイル時間をオーバーライドします。ただし、シングル スレッド モードは、一度選択するとオーバーライドできません。

デフォルトのモードはシリアル化されています。

表示されている速度低下は、リクエストのシリアル化です。スレッド モデルを変更すると、速度が向上します。「安全でない」とは、おそらくリーダーとライターの両方を同時に意味することに注意してください。読者のみにとって最適なモードが何であるかはわかりません。

于 2012-12-27T19:59:12.550 に答える