私は3つのテーブルを含む大規模な(〜10GB)SQLiteデータベースを扱っています:IDと「タイトル」TEXT
列を含むドキュメント、IDと「用語」TEXT
列を含む用語、そして最後にid、 "documentId" INT
、および "termId"INT
で、Terms テーブルの行を Document テーブルの行にマッピングします。ドキュメントに同じ用語が複数回含まれている場合、DocumentTerms テーブルには複数のエントリがあります。
とにかく、私の問題は、次の手順を含む各用語で tfidf 用語の重みを実行する必要があることです (各ステップを取得する必要があると思われるクエリを含めました)。
- すべての文書で用語が何回出現するかを調べる -
SELECT COUNT(*) FROM DocumentTerms WHERE termId=id
- 文書の総数を調べる -
SELECT COUNT(*) FROM Documents
- 用語が出現する文書の数を調べる --
SELECT COUNT(*) FROM DocumentTerms WHERE termId=id GROUP BY documentId
明らかに、#2 を実行する必要があるのは 1 回だけです。
このような大規模なデータベースでは、各クエリに非常に長い時間がかかります。ドキュメントの数 ( ) を調べるだけで、SELECT COUNT(*) FROM Documents
約 45 秒かかります。
速度を上げるために、いくつかのプラグマを試しました。これを実行する必要があるのは 1 回だけなので、操作中に電源が切れたり何かが失われた場合に DB が破損するかどうかはあまり気にしません。
PRAGMA synchronous = OFF
PRAGMA page_size = 4096
PRAGMA cache_size = 16384
PRAGMA temp_store = MEMORY
PRAGMA journal_mode = OFF
PRAGMA locking_mode = EXCLUSIVE
これらのアクセス時間を短縮するにはどうすればよいですか??