在Android上处理大型sqlite数据库

问题描述:

我正在使用专用Android设备进行指纹匹配。可以是该设备上具有500K记录的数据库。在Android上处理大型sqlite数据库

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

dalvik.vm.heapgrowthlimit =742米 dalvik.vm.heapsize =812米

我试图预负载从SQlite到内存的大约250MB数据库需要大量的时间。我使用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 
+4

是否真的有必要预加载数据库中的东西?使用数据库的原因之一是为了快速访问,除非每次加载内容时都要进行严格的处理,否则简单地重新加载可能会更简单。 “ –

+1

”使用Android/Java接口是一个失败的原因,我应该在原生C代码中完成所有这些工作?“ - 我希望在本地代码中也需要很长时间。 **巨大**,闪存速度很慢。更不用说,我不确定SQLite是否被认为是NDK的一部分。 “使用Android Java界面可以加快游标加载速度吗?” - 可能,但是我们看不到你的代码,因为你没有粘贴到你的问题中。使用Traceview来确定你的性能问题所在。 – CommonsWare

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

SQL只是加载这种类型的数据的错误工具,即使你是在16G核心服务器上运行32G的RAM,我仍会推荐使用cdb或Lucene。