2011-08-07 32 views
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ファイル

+4

なぜあなたのコードは画面の途中にあるのですか? –

+0

これは疑いの余地のない話題ですが、SQLiteにはデータバインディングAPIが用意されており、INSERT INTOステートメントを常に作成してループ内で実行しなくてもデータを適用できます。また、あなたはあなたの入力をサニタイズする必要はありません。これらのパラメータにバインドされた文字列は、SQL文のロジックを妨げることができないためです。あなたはこれを調べるべきです。 (それは最終的なファイルサイズとは関係ありませんが)多くの時間と労力を節約します。 –

+0

私は過去にSQLiteを使ってきましたが、それほど多くのスペースを占めることは決してありませんでした。私の音楽データベースには6000以上の曲が含まれていますが、20MBほどしかかかりません。これには、トリガー、共通のビューなどとともに、さまざまなアーティストデータなどの複数のテーブルがあります。表示しているコードは、DBに格納されている_only_データだけですか? –

答えて

0

を減らすことができますどのように私はそれを証明する方法はありませんが、私は、インデックスは、トラブルの原因である疑いがあることを私を助けてください。インデックスは膨大な量の領域を占める可能性があり、そのうち3つのインデックスがあります。それらなしでそれを試して、アクセスがまだ許容できるほど速いかどうかを見てください。そのようにデータベースのサイズをはるかに小さくする必要があります。

関連する問題