On Wed, 19 Apr 2006, Joe Wilson wrote:

>--- [EMAIL PROTECTED] wrote:
>> Joe Wilson <[EMAIL PROTECTED]> wrote:
>> >
>> > If you read the blob all in at once, true.
>> > But doesn't sqlite3BtreeData() allows you to read a partial chunk of
>> > data from the blob at an arbitrary offset? This could be advantageous
>> > if you are dealing with multi-megabyte blobs and do not require/want
>> > the entire blob in memory at once.
>> >
>>
>> sqlite3BtreeData() actually reads a prefix of the data.
>> Because of the way large blobs are stored (as a linked list
>> of disk pages) you have to start reading at the beginning
>> and read everything up to the point of interest.
>
>Random access for blobs would be ideal, but even a sequential block
>fetching mechanism for blobs would be a useful SQLite API addition.


You could simply partition the blob yourself, and use a compound key to
access parts of a BLOB at random:
CREATE TABLE blocks (
        id integer,
        offset integer,
        block blob,
        primary key (id,offset) );

Assuming you store, say, 16K in each block, then access to any one 16k
block then becomes a single index lookup and 17 page reads. Much more
efficient than storing the whole BLOB in one.

Christian

-- 
    /"\
    \ /    ASCII RIBBON CAMPAIGN - AGAINST HTML MAIL
     X                           - AGAINST MS ATTACHMENTS
    / \

Reply via email to