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 文件太大....?的主要内容,如果未能解决你的问题,请参考以下文章
这个 Rails 文件存储在哪里? db/development.sqlite3