2011-08-07 3 views
0

저는 Sqlite와 QT를 사용하여 85000 개의 레코드를 포함하는 사전 파일을 생성했습니다. sqlite의 파일이 너무 크고 134MB이고 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는 "INSERT INTO"문을 끊임없이 생성하고 루프 내에서 실행할 필요없이 데이터를 적용 할 수있는 데이터 바인딩 API를 제공합니다. 또한 입력을 위생적으로 관리 할 필요가 없다는 것을 의미합니다. 이러한 매개 변수에 바인드 된 문자열은 SQL 문의 논리와 간섭 할 수 없으므로 이 일을 조사해야합니다. 그것은 많은 시간과 노력을 절약합니다 (최종 파일 크기와는 아무런 관련이 없습니다). –

+0

나는 과거에 SQLite를 사용 해왔고 그만큼 많은 공간을 차지하는 것을 본 적이 없다. 내 음악 데이터베이스에는 6000 곡이 포함되어 있으며 20MB 정도 밖에 안 남습니다. 그리고 여러 아티스트 데이터 테이블과 트리거, 공통 뷰 등 여러 테이블이 있습니다. 표시 할 코드가 DB에 저장된 _only_ 데이터인지 확신 할 수 있습니까? –

답변

0

을 줄일 수있는 방법을 내가 그것을 증명할 방법이 없다,하지만 난 인덱스가 문제의 원인 의심 것을 도와주세요. 인덱스는 엄청난 양의 공간을 차지할 수 있으며, 세 개가 있습니다. 그들없이 시도해보고 액세스가 여전히 수용 가능한지 알아보십시오. 데이터베이스 크기는 그렇게 작아야합니다.

관련 문제