SQLite一次性讀取過多記錄,造成內存溢出OutOfMemoryError

Android 2.3.3 
Eclipse Version: 3.7.0
LogCat

LogCat  報錯信息:

03-14 13:16:52.033: ERROR/AndroidRuntime(4399): java.lang.OutOfMemoryError 
03-14 13:16:52.033: ERROR/AndroidRuntime(4399):     at android.database.CursorWindow.getString_native(Native Method) 
03-14 13:16:52.033: ERROR/AndroidRuntime(4399):     at android.database.CursorWindow.getString(CursorWindow.java:329) 
03-14 13:16:52.033: ERROR/AndroidRuntime(4399):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:49) 
03-14 13:16:52.033: ERROR/AndroidRuntime(4399):     at com.taobao.htc.db.RecordDBHelper.query(RecordDBHelper.java:140) 
03-14 13:16:52.033: ERROR/AndroidRuntime(4399):     at com.taobao.htc.manage.RecordDBopt.get(RecordDBopt.java:80) 
03-14 13:16:52.033: ERROR/AndroidRuntime(4399):     at com.taobao.htc.manage.RecordMessage.sendAll(RecordMessage.java:55) 
03-14 13:16:52.033: ERROR/AndroidRuntime(4399):     at com.taobao.htc.Check.run(Check.java:456) 
03-14 13:16:52.033: ERROR/AndroidRuntime(4399):     at java.lang.Thread.run(Thread.java:1019)

同時有報錯信息


03-14 13:17:24.763: ERROR/CursorWindow(4399): need to grow: mSize = 1048576, size = 37, freeSpace() = 5, numRows = 6974 
03-14 13:17:24.773: ERROR/CursorWindow(4399): not growing since there are already 6974 row(s), max size 1048576 
03-14 13:17:24.804: ERROR/Cursor(4399): Failed allocating 37 bytes for text/blob at 6973,3 

03-14 14:00:59.463: ERROR/CursorWindow(4399): need to grow: mSize = 1048576, size = 72, freeSpace() = 18, numRows = 6974 
03-14 14:00:59.473: ERROR/CursorWindow(4399): not growing since there are already 6974 row(s), max size 1048576 
03-14 14:00:59.543: ERROR/CursorWindow(4399): The row failed, so back out the new row accounting from allocRowSlot 6973 
03-14 14:00:59.543: ERROR/Cursor(4399): Failed allocating fieldDir at startPos 0 row 6973 


發生錯誤原因分析:

數據庫中Record表的數據較多,大概有兩萬條,從以上錯誤信息,可以看出,大約讀取到6974條時報錯。CursorWindow一次性打開數據太多,造成內存溢出。 

解決辦法:

先查詢Record表的數據量,如果過大,做分批處理,每次處理5000條左右的數據,避免讀取更多數據造成內存溢出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章