`
iihero
  • 浏览: 258421 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQLite Blob读写的局限性

 
阅读更多
在使用SQLite在Windows Mobile上的大容量BLOB读写时,遇到一个OOM的问题,让我们都觉得不可思议:
    executeStmt(db, stmt, "create table foo(id integer not null primary key, content blob null, content2 blob null)");
   
    sqlite3_stmt* stmt2 = NULL;
    executeStmt(db, stmt, "insert into foo(id) values(10)");

    sqlite3_stmt* stmt3 = NULL;
    executeStmt(db, stmt3, "update foo set content=zeroblob(10*1024*1024) where rowid=10");

    sqlite3_stmt* stmt4 = NULL;
    executeStmt(db, stmt4, "update foo set content2=zeroblob(1024) where rowid=10"); // OOM here

    不过是0单列的0填充而已,怎么会OOM呢?

我直接给它的作者D. Richard Hipp和他的team发邮件询问,得到的答复是:
每次更新,sqlite都会读取该行的数据,加载到内存里。难怪,第一列可是要10M内存。
Richard建议:使用incremental BLOB I/O mechanism机制进行读写。
可是这个机制局限性依然明显:
e.g.
first write,  20K, then append 10K.  If we want to append it,  we need to zeroblob 30K first. Otherwise, sqlite_blob_write will fail to write the chunk.
???
他的答复是:

Unfortunately, no; there is no way to increase the size of a row without allocating memory sufficient to hold the entire row.
除非要更改sqlite的文件格式。一旦更改,将会打破与以前sqlite文件的兼容性。那是不可容忍的。

看来,使用小内存逐步更改blob字段,在目前来看不太现实。
1
1
分享到:
评论

相关推荐

    java sqlite blob 读写

    java sqlite bolb 将图片存入sqlite blob 字段中,然后读取sqlite

    C++插入SQLite数据库的BLOB字段

    本示例中,我们将探讨如何在Visual Studio 2010环境下,将一个jpg图片文件作为BLOB(Binary Large Object)类型的数据插入到SQLite数据库中。这涉及到文件I/O操作、SQLite API的使用以及C++编程技巧。 首先,我们...

    C#多线程读写sqlite

    当多线程环境对SQLite进行读写操作时,可能会引发数据竞争和并发问题,因此必须采取适当的同步策略来确保数据的一致性和完整性。 标题"**C#多线程读写sqlite**"涉及的主要知识点包括: 1. **多线程编程**:C#中的`...

    SQLite数据库读写示例

    通过SQLite提供的API,我们可以轻松地进行数据库的读写操作,实现数据的持久化存储。在`SQLiteDemo`这个示例中,可能包含了创建、查询、更新和删除数据的完整代码实例,帮助开发者更好地理解和应用SQLite。

    SQLite3使用blob存储文件的VC程序

    Blob(Binary Large Object)是SQLite3中用于存储二进制大数据类型的一种方式,它可以用来保存图片、音频、视频或者其他任何非文本格式的数据。 在VC6环境下,开发SQLite3的程序通常涉及到以下几个关键知识点: 1....

    C#解决SQlite并发异常问题的方法(使用读写锁)

    本文实例讲述了C#解决SQlite并发异常问题的方法。分享给大家供大家参考,...作者利用读写锁(ReaderWriterLock),达到了多线程安全访问的目标。 using System; using System.Collections.Generic; using System.Text;

    sqlite3_blob_test.zip

    通过这个库,可以创建数据库对象,执行SQL语句,以及更方便地读写BLOB数据。例如,可以创建一个Statement对象,设置参数,然后执行插入BLOB的SQL语句。 项目中的文件`sqlite3_test.sln`是Visual Studio的解决方案...

    sqlite读写VC例子

    在这个"sqlite读写VC例子"中,我们将会探讨如何在VC8环境下利用SQLite库进行数据库的创建、查询、插入和更新等基本操作。 首先,你需要包含SQLite的头文件,并链接相应的库。在VC8项目中,你可以通过设置项目属性来...

    C#操作SQLite数据库之读写数据库的方法

    本文实例讲述了C#操作SQLite数据库之读写数据库的方法。分享给大家供大家参考,具体如下: 这里演示读写数据库并在窗体(Form)中显示其数据,其方式为: 读: Database(SQLite) -> DataAdapter -> DataSet -> ...

    C++ Builder XE 读取sqlite图片Blob字段的多种方法.rar

    C++ Builder XE 读取sqlite图片Blob字段的多种存取方法: 利用TMemoryStream *mem=new TMemoryStream; TBlobField *blob_pic=(TBlobField *)Form1->FDQuery1->Fields->FieldByName("image"); blob_pic->...

    JAVA中SQLlite数据库BLOB数据类型的存取.docx

    JAVA 中 SQLlite 数据库 BLOB 数据类型的存取 JAVA 中 SQLlite 数据库 BLOB 数据类型的存取是指在 JAVA 语言中使用 SQLlite 数据库来存储和读取大型二进制对象(BLOB),以便实现文件存储和读取的功能。本文将详细...

    VS、VC++实现对象序列化保存到sqlite表blob类型字段中,包含blob字段的读取和保存,

    本文将详细讲解如何在VS(Visual Studio)和VC++环境中实现对象序列化,并将其保存到SQLite数据库的blob(Binary Large Object)类型字段中。同时,我们也会探讨如何从blob字段中读取并恢复这些对象。 首先,对象...

    Sqlite大对象字段读写及数据流的解压缩

    以下是如何读写BLOB字段的示例: ```csharp using System.Data.SQLite; // 连接SQLite数据库 SQLiteConnection conn = new SQLiteConnection("Data Source=mydatabase.db;Version=3;"); conn.Open(); // 创建命令...

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

    这个库使得 C# 开发者能够方便地在他们的应用程序中集成 SQLite 数据库的读写功能。SQLite 是一个轻量级、开源的关系型数据库,它不需要单独的服务器进程,可以直接在应用程序中使用,适合于移动设备、嵌入式系统...

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

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

    利用VB存取数据库中BLOB数据

    在处理数据库中的BLOB(Binary Large Object)数据时,VB提供了丰富的功能。BLOB类型通常用于存储非结构化的数据,如图片、音频、视频或者任何二进制文件。以下将详细讲解如何利用VB来存取数据库中的BLOB数据。 ...

    sqlite数据库读写库项目工程代码

    C++读写sqlite数据库,接口封装项目工程代码,可以根据需要自行扩展

    sqlite3 xml读写

    在SQLite3中进行XML读写涉及以下几个主要知识点: 1. **XML数据类型**:SQLite3本身并不直接支持XML数据类型,但可以通过TEXT或BLOB类型来存储XML数据。在处理XML时,通常会将其作为字符串存储。 2. **XML解析**:...

    Lazarus_SQLite3教程

    SQLite3是一个轻量级的数据库系统,提供了便携式、嵌入式、事务性的SQL数据库引擎。它不需要单独的服务器进程运行,因此被广泛应用于小型应用和原型开发中。本文将围绕如何使用Lazarus与SQLite3进行开发提供一个入门...

    著名的Delphi封装的SQLite3读写类(Unicode版本)

    著名的Delphi封装的SQLite3读写类(Unicode版本),A SIMPLE DELPHI WRAPPER FOR SQLITE 3(Update 10 February 2011),玩SQLite基本上都知道。注意,这个只是封装类或方法,非控件!

Global site tag (gtag.js) - Google Analytics