0
私はSqliteとQTで85000レコードを含む辞書ファイルを作成しています。 sqliteのファイルが大きすぎる、それは134メガバイト、MDic DBのような別の辞書はsqliteで作成された同じデータを持ち、同じレコードが10MBです!Sqlite DBファイルが大きすぎます....?
query.exec("PRAGMA journal_mode = MEMORY");
query.exec("PRAGMA synchronous = OFF");
Dic_entry DictionaryEntry = DictionaryInstance.readEntry();
QString definition, headword, displayedHeadWord;
query.exec("BEGIN Transaction");
int Count = 0;
while(!DictionaryEntry.headword.empty())
{
definition = QString::fromStdString(DictionaryEntry.definition);
definition.replace("'", "''");
headword = QString::fromStdString(DictionaryEntry.headword);
headword.replace("'", "''");
displayedHeadWord = QString::fromStdString(DictionaryEntry.displayedHeadword);
displayedHeadWord.replace("'", "''");
string strQuery = "INSERT INTO Dictionary_Words([Definition], [HeadWord], [DisplayedHeadWord]) "
"values('"
+ definition.toStdString() + "', '"
+ headword.toStdString() + "', '"
+ displayedHeadWord.toStdString()
+ "')";
query.exec(QString::fromStdString(strQuery));
if(Count == 200)
{
query.exec("COMMIT TRANSACTION");
Count = 0;
}
Count++;
DictionaryEntry = DictionaryInstance.readEntry();
}
query.exec("End Transaction");
query.exec("CREATE INDEX HW_idx ON [Dictionary_Words](HeadWord)");
query.exec("CREATE INDEX Def_idx ON [Dictionary_Words](Definition)");
query.exec("CREATE INDEX DHW_idx ON [Dictionary_Words](DisplayedHeadword)");
query.exec("PRAGMA auto_vacuum=FULL");
db.close();
私は私のSQLiteのDBファイル
なぜあなたのコードは画面の途中にあるのですか? –
これは疑いの余地のない話題ですが、SQLiteにはデータバインディングAPIが用意されており、INSERT INTOステートメントを常に作成してループ内で実行しなくてもデータを適用できます。また、あなたはあなたの入力をサニタイズする必要はありません。これらのパラメータにバインドされた文字列は、SQL文のロジックを妨げることができないためです。あなたはこれを調べるべきです。 (それは最終的なファイルサイズとは関係ありませんが)多くの時間と労力を節約します。 –
私は過去にSQLiteを使ってきましたが、それほど多くのスペースを占めることは決してありませんでした。私の音楽データベースには6000以上の曲が含まれていますが、20MBほどしかかかりません。これには、トリガー、共通のビューなどとともに、さまざまなアーティストデータなどの複数のテーブルがあります。表示しているコードは、DBに格納されている_only_データだけですか? –