Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 当一个块可能跨越两个blob时,从SQlite blob读取块_Arrays_Sqlite_Blobs_Circular Buffer - Fatal编程技术网

Arrays 当一个块可能跨越两个blob时,从SQlite 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函数,它相当愚蠢,

我需要从SQlite数据库中读取任意大小(但通常很小)的二进制数据块。数据库位于磁盘上,数据存储在由一个id和一个256到64k字节的只读blob组成的行中(长度总是2的幂)。我使用SQlite将块读入可重写缓冲区,然后取块中值的平均值,并缓存结果

我遇到的问题是,由于块的大小是任意的,所以blob大小只是偶尔是块大小的整数倍。这意味着一个块将非常频繁地跨越两个blob

我想要的是一种简单而优雅的方式(因为“优雅不是可选的”)来处理这个稍微尴尬的场景。我有一个
readchunk
函数,它相当愚蠢,只需读取块并计算平均值。到目前为止,我已经尝试了以下策略:

  • 只读取重叠块的第一部分,丢弃第二部分
  • 使
    read chunk
    了解blob边界,以便它可以在适当的地方移动到下一个blob
  • 使用类似环形缓冲区的东西,这样重叠的块就可以环绕边缘
第一个选项是最简单的,但并不令人满意,因为它丢弃了潜在的重要信息。由于
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))