2013-10-03 57 views
0

我正在使用專用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

回答

1

你不需要改變大多數這類數據,因此,你應該使用cdb或一個及其替代品來代替。這將加速對數據庫的訪問,並且您仍然可以使用SQLite來存儲新的或已更改的記錄。實際上,如果您爲數據使用原始內存轉儲格式,但可能會使搜索更難,您可能會在加載時間方面做得更好。如果搜索時間是一個問題,請考慮使用Lucene將數據存儲在RAM中。

SQL只是加載這種類型的數據的錯誤工具,即使你是在16G核心服務器上運行32G的RAM,我仍會推薦使用cdb或Lucene。