【问题标题】:How to populate a large sqlite database on first run如何在首次运行时填充大型 sqlite 数据库
【发布时间】:2013-08-08 19:53:56
【问题描述】:

我正在开发一个基于 SQLite 数据库的字典应用程序,该数据库拥有超过 300,000 行。

问题在于,最终形式的数据库文件由全文索引表组成,重量远远超过 150Mb

通过创建无内容的 fts4 表,我已设法将 .db 文件大小降至最低。 数据库不能再小了。我还设法将预先填充的数据库放入应用程序中,它工作正常。

问题是我不能只将最终的 .db 文件保存在 /assets 中并在第一次运行时将其复制到 sdcard,因为它太大了。我也不想在第一次运行时下载它。

批量INSERTing 数据,即使优化了事务和 sqlite,并且在开始时没有索引需要 永远,所以它也不是一个选项。

好消息是用于构建数据库的原始数据,以 CSV 格式和压缩,是 30Mb 并且 sqlite 的命令行.import 选项非常快(100,000 行大约 1 秒)但是...没有root权限就无法从应用程序访问。

我希望将应用程序与 /assets 中的压缩 CSV 文件捆绑在一起,解压缩它们,在 sdcard 上创建数据库,然后导入 CSV,但 似乎 在我看来是不可能的。尽管有许多字典应用程序似乎正是这样做的。 (下载的应用程序有十几兆字节,第一次运行时构建数据库,并在 sdcard 上占用数百兆字节的空间。

我该如何做到这一点?

过去两周我一直在研究这个问题,但完全没有想法。我是 Android 开发的新手,因此我们将不胜感激。

【问题讨论】:

  • 事务 s 还是事务?仅对所有插入使用单个事务很快。
  • 我的意思是单笔交易。确实需要几分钟。
  • 您是否使用 PRAGMA 语句(在所有其他语句之前调用,sqlite 数据库上的第一个命令)来关闭 sqlite 同步模式(同步=关闭)并仅依赖操作系统来分析您的应用程序?还将日志模式更改为内存:sqlite.org/pragma.html#pragma_synchronous
  • 是的。这显着加快了速度,但与 sqlite 命令行 .import 相比仍然算不了什么。

标签: java android database sqlite csv


【解决方案1】:
  • 方案A:发送一个压缩的SQLite数据库文件,安装后解压;您应该能够省略索引并在以后重建它们。
  • B 计划:将 CSV 导入器的相关部分复制到您的应用程序中,发送一个压缩的 CSV 文件并将其加载到一个空数据库中,就像命令行工具一样。 Official documentation page.

【讨论】:

  • 我实际上是在发布问题后立即实施Plan A。但是Plan B听起来要好得多。谢谢!完成后我会发布结果。
  • 结果表明,Plan APlan B 一样减少了必要数据的大小。并且无需使用 csv 插件编译 sqlite。 Plan A 是最好的选择。再次感谢您。
【解决方案2】:

将整个内容创建为 csv 文件,可能是多个 csv 文件并压缩为 zip。我检查了 32 mb 的 csv 文件,压缩后文件变为 482KB。

举例

data1.csv 数据2.csv 数据3.csv 数据4.csv 数据5.csv

将文件压缩成data.zip并将文件放入asset文件夹,导入时-从zip中一个一个提取文件并插入sqlite db。

【讨论】:

  • 但是如何导入 csv 文件呢?即时将它们转换为 SQL 并批量插入需要数小时并导致应用程序崩溃。唯一可行的选择是使用.import data.csv sqlite 命令,但无法从应用程序内访问。
猜你喜欢
  • 2017-11-25
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
相关资源
最近更新 更多