Arrays 当一个块可能跨越两个blob时,从SQlite blob读取块
我需要从SQlite数据库中读取任意大小(但通常很小)的二进制数据块。数据库位于磁盘上,数据存储在由一个id和一个256到64k字节的只读blob组成的行中(长度总是2的幂)。我使用SQlite将块读入可重写缓冲区,然后取块中值的平均值,并缓存结果 我遇到的问题是,由于块的大小是任意的,所以blob大小只是偶尔是块大小的整数倍。这意味着一个块将非常频繁地跨越两个blob 我想要的是一种简单而优雅的方式(因为“优雅不是可选的”)来处理这个稍微尴尬的场景。我有一个Arrays 当一个块可能跨越两个blob时,从SQlite blob读取块,arrays,sqlite,blobs,circular-buffer,Arrays,Sqlite,Blobs,Circular Buffer,我需要从SQlite数据库中读取任意大小(但通常很小)的二进制数据块。数据库位于磁盘上,数据存储在由一个id和一个256到64k字节的只读blob组成的行中(长度总是2的幂)。我使用SQlite将块读入可重写缓冲区,然后取块中值的平均值,并缓存结果 我遇到的问题是,由于块的大小是任意的,所以blob大小只是偶尔是块大小的整数倍。这意味着一个块将非常频繁地跨越两个blob 我想要的是一种简单而优雅的方式(因为“优雅不是可选的”)来处理这个稍微尴尬的场景。我有一个readchunk函数,它相当愚蠢,
readchunk
函数,它相当愚蠢,只需读取块并计算平均值。到目前为止,我已经尝试了以下策略:
- 只读取重叠块的第一部分,丢弃第二部分
- 使
了解blob边界,以便它可以在适当的地方移动到下一个blobread chunk
- 使用类似环形缓冲区的东西,这样重叠的块就可以环绕边缘
read chunk
经常被调用,我不想用太多的分支逻辑使其负担过重,因此第二个选项也没有吸引力。使用环形缓冲区(或类似的东西)似乎是一个优雅的解决方案。我设想的是一个生产者从blob中读取中等大小(比如256字节)的数据块到1k缓冲区,然后一个消费者在缓冲区上调用read chunk
,在适当的地方进行包装。由于我将始终处理2的幂,生产者将始终与缓冲区的边缘对齐,并且我还可以避免使用mod
来计算生产者和消费者的指数
我使用的是Lisp(CL),但由于这似乎是一个通用的算法或数据结构问题,所以我将其与语言无关。我感兴趣的是澄清我有哪些选项-除了我列出的选项之外还有其他选项吗?为了确保它的价值-以防有人感兴趣-我实现了最后一个选项(环形缓冲区),它工作得很好。我使用下面的公式来有效地计算索引-
(defun(ab)(logand a(1-b))
,因为除数总是2的幂。当然,这应该是(defun mod2(ab)(logand a(1-b))
。