Sqlite DB 文件太大....?

Posted

技术标签:

【中文标题】Sqlite DB 文件太大....?【英文标题】:Sqlite DB File is too huge....? 【发布时间】:2011-08-07 00:27:20 【问题描述】:

我一直在使用 Sqlite 和 QT 创建一个包含 85000 条记录的字典文件。 sqlite的文件太大了,134MB,另外一个像MDic DB这样的字典有用sqlite创建的相同的数据,相同的记录是10MB!

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 左右。它有多个包含各种艺术家数据等的表格,以及触发器、公共视图等。您确定您显示的代码是存储在数据库中的唯一数据吗? 顺便说一句,如果您更好地使用 Qt 功能,那么您可以编写更清晰的代码。例如:QString strQuery = QString("INSERT INTO Dictionary_Words([Definition], [HeadWord], [DisplayedHeadWord]) values('%1','%2','%3')").arg(definition, headword, displayedHeadWord); 来构建您的查询。 【参考方案1】:

我无法证明这一点,但我怀疑索引是问题的原因。索引会占用大量空间,而您拥有其中的三个。在没有它们的情况下尝试一下,看看访问速度是否仍然可以接受;这样数据库大小应该会小得多。

【讨论】:

以上是关于Sqlite DB 文件太大....?的主要内容,如果未能解决你的问题,请参考以下文章

跨多个 sqlite db 文件连接

这个 Rails 文件存储在哪里? db/development.sqlite3

我们可以将 SQL Server 数据库文件转换为 SQLite 文件或 .db 文件吗?

sqlite 查询db文件中所有的表名

sqlite数据导入mysql

扩展SQLite使其能从apk文件中读取db