2011-08-07 30 views
0

我一直在創建一個包含Sqlite和QT的85000記錄的字典文件。 sqlite的文件太大了,它是134MB,而像MDic DB這樣的另一個字典與sqlite創建的數據相同,並且相同的記錄是10 MB!Sqlite數據庫文件太大....?

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的數據庫文件

+4

爲什麼你的代碼在我的屏幕中間? –

+0

這是無可爭議的,但SQLite有一個數據綁定API,允許您應用數據,而不必不斷創建「INSERT INTO」語句並在循環中執行它們。這也意味着你不必清理你的輸入;因爲綁定到這些參數的字符串不會干擾SQL語句的邏輯。你應該考慮這樣做;它節省了大量時間和精力(儘管它與最終的文件大小無關)。 –

+0

我以前用過SQLite,我從來沒有見過佔用這麼多空間。我的音樂數據庫包含6000多首歌曲,它只需要20MB左右。那裏有多個表格,包括各種藝術家數據等,以及觸發器,常見視圖等。您確定您顯示的代碼是存儲在數據庫中的_only_數據嗎? –

回答

0

我沒有證明它的方式,但我懷疑的指標是故障的原因。索引可佔用大量空間,並且你有三個。嘗試沒有它們,看看訪問是否仍然快得可以接受;數據庫大小應該小得多。