在Android上处理大型sqlite数据库



我正在开发用于指纹匹配的专用Android设备。可以是此设备上具有 500K 条记录的数据库。

我已经修改了这些设备上的 ROM 以使用指令增加堆大小 -

dalvik.vm.heapgrowthlimit=742mdalvik.vm.heapsize=812m

我正在尝试将大约 250MB 的数据库从 SQlite 预加载到内存中,这需要花费大量时间。我已经使用Android SQLite接口在java中实现了这段代码。加载 10 条记录大约需要 32,000 分钟,使用 Android/Java 界面是否是一个失败的原因,我应该在本机 C 代码中完成所有这些操作?

是否可以使用Android Java界面进行任何改进来加速光标加载?

当Android加载记录时,我一直看到这些消息:

-03 09:18:53.802 D/dalvikvm( 5234): GC_FOR_ALLOC freed 18K, 3% free 305194K/313816K, paused 187ms, total 187ms
10-03 09:18:53.982 D/dalvikvm( 5234): GC_FOR_ALLOC freed 0K, 3% free 305213K/313816K, paused 178ms, total 178ms
10-03 09:18:53.982 I/dalvikvm-heap( 5234): Grow heap (frag case) to 300.238MB for 4963-byte allocation
10-03 09:18:54.163 D/dalvikvm( 5234): GC_FOR_ALLOC freed 19K, 3% free 305204K/313824K, paused 176ms, total 176ms
10-03 09:18:54.333 D/dalvikvm( 5234): GC_FOR_ALLOC freed <1K, 3% free 305222K/313824K, paused 178ms, total 178ms
10-03 09:18:54.333 I/dalvikvm-heap( 5234): Grow heap (frag case) to 300.246MB for 4389-byte allocation

您不需要更改大部分数据,因此您应该改用 cdb 或其替代方案之一。这将加快对数据库的访问速度,并且您仍然可以使用 SQLite 来存储新的或更改的记录。实际上,如果您对数据使用原始内存转储格式,您可能会在加载时间上做得更好,但这可能会使搜索更加困难。如果搜索时间是一个问题,请考虑使用 Lucene 将数据存储在 RAM 中。

SQL只是加载此类数据的错误工具,即使您在具有32G RAM的16核服务器上运行它,我仍然推荐cdb或Lucene。

最新更新