`
debuglog
  • 浏览: 196313 次
社区版块
存档分类
最新评论

SQLite一次性读取过多记录会造成内存溢出OutOfMemoryError

阅读更多

Android 2.3.3
Eclipse Version: 3.7.0
LogCat

 LogCat  报错信息:

03-15 11:34:43.163: ERROR/AndroidRuntime(17173): java.lang.OutOfMemoryError 
03-15 11:34:43.163: ERROR/AndroidRuntime(17173):     at android.database.CursorWindow.getString_native(Native Method) 、03-15 11:34:43.163: ERROR/AndroidRuntime(17173):     at android.database.CursorWindow.getString(CursorWindow.java:329) 
03-15 11:34:43.163: ERROR/AndroidRuntime(17173):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:49) 
03-15 11:34:43.163: ERROR/AndroidRuntime(17173):     at com.tmall.nokia.db.RecordDBHelper.query(RecordDBHelper.java:140) 
03-15 11:34:43.163: ERROR/AndroidRuntime(17173):     at com.tmall.nokia.manage.RecordDBopt.get(RecordDBopt.java:80) 
03-15 11:34:43.163: ERROR/AndroidRuntime(17173):     at com.tmall.nokia.manage.RecordMessage.sendAll(RecordMessage.java:55) 
03-15 11:34:43.163: ERROR/AndroidRuntime(17173):     at com.tmall.nokia.Check.run(Check.java:456) 
03-15 11:34:43.163: ERROR/AndroidRuntime(17173):     at java.lang.Thread.run(Thread.java:1019)

同时有报错信息

03-15 11:30:21.763: ERROR/CursorWindow(17173): need to grow: mSize = 1048576, size = 37, freeSpace() = 5, numRows = 6974
03-15 11:30:21.773: ERROR/CursorWindow(17173): not growing since there are already 6974 row(s), max size 1048576 
03-15 11:30:21.804: ERROR/Cursor(17173): Failed allocating 37 bytes for text/blob at 6973,3 

  或

03-15 11:34:40.463: ERROR/CursorWindow(4647): need to grow: mSize = 1048576, size = 72, freeSpace() = 18, numRows = 6974 
03-15 11:34:40.473: ERROR/CursorWindow(4647): not growing since there are already 6974 row(s), max size 1048576 
03-15 11:34:40.543: ERROR/CursorWindow(4647): The row failed, so back out the new row accounting from allocRowSlot 6973 
03-15 11:34:40.543: ERROR/Cursor(4647): Failed allocating fieldDir at startPos 0 row 6973 
 

 

发生错误原因分析:

 

读取数据库的缓存大约为1M,CursorWindow一次性打开数据太多,造成内存溢出。

数据库中Record表的数据较多,大概有两万条,从以上错误信息,可以看出,大约读取到6974条时报错。 

 

 

解决办法:

 

先查询Record表的数据量,如果过大,做分批处理,每次处理一定量的数据,避免读取更多数据造成内存溢出。

 

0
0
分享到:
评论
1 楼 wzuying 2012-06-06  
不懂吖,怎么分批啊,最多读到2600就错了,要是几万条不是读很久的吗?

相关推荐

    php读取SQLite数据库

    在IT行业中,SQLite是一个轻量级的、无服务器的、自包含的SQL数据库引擎,它被广泛用于嵌入式系统和Web应用中。PHP是一种流行的开源脚本语言,尤其适用于Web开发,它能够轻松地与各种数据库进行交互,包括SQLite。在...

    C#读取SQLite数据库源代码

    假设我们有一个名为"Users"的表,想要读取所有记录: ```csharp SQLiteCommand cmd = new SQLiteCommand("SELECT * FROM Users", conn); SQLiteDataReader reader = cmd.ExecuteReader(); ``` 使用...

    Sqlite数据库里插入数据的条数上限是500

    原来一次性向数据库里插入数据的条数不能太多,上限是500条。超出会报错。 解决方案就是只好分多次插入数据库了。 您可能感兴趣的文章:SQLite教程(八):命令行工具介绍SQLite教程(十二):锁和并发控制详解...

    MFC CListCtrl虚表读取Sqlite数据

    一次性全量读取是将所有数据一次性从数据库中取出,然后插入到控件中,这种方法适用于数据量较小的情况,但面对七万条以上的数据,会明显影响性能。分页读取则是每次只加载一部分数据,用户滚动时再加载更多,虽然比...

    WPF SQLite存储与读取二进制图片

    SQLite是一款开源、无服务器、零配置、事务性的SQL数据库引擎,适用于嵌入式环境,无需额外的安装或管理。它支持标准的SQL语法,并且提供了多种语言的API,包括C#,使得与.NET框架如WPF的集成变得简单。 二、WPF与...

    c#读取.db数据文件,适用于SQLite format 3

    SQLite是一个轻量级的、开源的、独立的数据库管理系统,广泛应用于嵌入式系统和移动应用。SQLite支持多种数据库格式,其中"SQLite format 3"是最新的版本,具有高效、可靠的特点。在C#编程环境下,可以利用.NET ...

    完美解决因数据库一次查询数据量过大导致的内存溢出问题

    数据库查询是应用程序与数据交互的重要环节,当一次性从数据库中获取的数据量过大时,可能会导致内存溢出(Memory Overflow)问题。内存溢出是程序在申请内存时,无法在分配到足够的内存空间来完成操作,这通常是...

    Delphi使用SQLite3内存数据库

    在本文中,我们将深入探讨如何在Delphi编程环境中利用SQLite3数据库系统,特别是关于本地数据库与内存数据库的使用。SQLite3是一种轻量级、自包含的数据库引擎,它不需要独立的服务器进程,使得在Delphi应用程序中...

    delphi 2010 sqlite数据库查询并读取BOLB图片例子

    自己写的业务工作用的一个资料查询实例,输入机号7088,可查询飞机公司代码和名称,并显示改飞机图片。用了zeos控件,这是个完整的sqlite桌面数据查询实例,图片以Bolb数据格式存储在数据库里,供初学参考。

    asp连接SQLite代码

    SQLite则是一个轻量级、开源的嵌入式关系数据库,广泛应用于各种平台,包括Web应用程序。在ASP中连接SQLite数据库,主要涉及到ODBC(Open Database Connectivity)驱动的使用,因为ASP默认支持ODBC接口来连接多种...

    sqlite3 window和liunx通过读取xml自动建内存表和硬盘表

    这个场景中,我们讨论的是如何在Windows和Linux环境下利用SQLite3通过读取XML文件自动生成内存表和硬盘表。 首先,XML文件是一种结构化的数据存储格式,通常用于数据交换或配置。在本例中,XML文件`collect_5k_...

    Python实现读取TXT文件数据并存进内置数据库SQLite3的方法

    本文将详细介绍如何使用Python读取TXT文件中的数据,并将其存储到SQLite3数据库中,同时也会涉及数据库的基本操作,如创建表、插入数据以及查询数据。 首先,我们需要导入`sqlite3`模块,这是Python标准库的一部分...

    C#使用SQLite存取图片的示例

    在.NET开发环境中,C#是一种常用的编程语言,而SQLite则是一种轻量级的、无服务器、自包含的数据库引擎,广泛应用于嵌入式系统和移动应用。本示例重点讲解了如何利用C#与SQLite数据库交互,特别是涉及到图片数据的...

    System.Data.SQLite.DLL C# 读写sqlite数据库

    System.Data.SQLite.DLL 是一个用于 .NET Framework 的 SQLite 数据库引擎的 ADO.NET 提供程序。这个库使得 C# 开发者能够方便地在他们的应用程序中集成 SQLite 数据库的读写功能。SQLite 是一个轻量级、开源的关系...

    sqlite内存数据库

    SQLite内存数据库,顾名思义,是指SQLite数据库在运行时存储于内存而非硬盘中的一种模式。这种模式下的数据库称为临时数据库,所有的数据只存在于运行期间,一旦数据库连接关闭,所有数据将自动清除。内存数据库的...

    sqlite文件读取工具 1.0.0.4版

    在我们的例子中,提到的"sqlite文件读取工具 1.0.0.4版"是一个专门用于解析SQLite数据库文件的应用程序,能够提取出一些常规SQLite开源库无法获取的信息。 SQLite数据库文件的内部结构分为多个区段,如页表、自由页...

    vc实现Sqlite数据库(加密DB、内存DB、临时DB)

    同时,我们还将介绍一个名为CSqlite的实用操作类,该类简化了与SQLite的交互,包括读取返回内容和获取返回头等信息。 首先,让我们了解SQLite的基本概念。SQLite是一个开源的、自包含的、完全事务性的SQL数据库引擎...

    EF和FreeSql读取Sqlite数据库的差别

    根据公司项目需求,学习了EF框架读取SQLITE数据库和FREESQL框架读取SQLITE数据库,这两种数据库的读取方式和效率,写了一个DEMO程序,也在学习和了解这两个方式的朋友可以下载参考一下。程序和源码都可以正常运行。...

    用于读取SQLite书库的c++Lib

    标题提到的“用于读取SQLite书库的c++Lib”很可能就是一个这样的库,旨在帮助C++程序员更加高效、便捷地操作SQLite数据库。 C++库通常会提供面向对象的API,将数据库连接、查询、事务等操作封装为类或函数,使得...

    android异步加载网络图片,双缓存内存加sd卡缓存 绝对不会出现内存溢出oom

    本文将深入探讨如何实现一个高效、安全的网络图片加载机制,结合双缓存策略,确保图片加载过程既快速又不会导致内存溢出(Out Of Memory, OOM)。 首先,我们要理解为什么需要异步加载。在Android中,如果在主线程...

Global site tag (gtag.js) - Google Analytics