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) には内部ロックがありません。実際、一部のテストでは、並列バージョンの方が実行速度が遅くなります!