0

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

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

我正在寻找的是一种简单而优雅(因为'优雅不是可选')的方式来处理这个稍微尴尬的场景。我有一个read-chunk相当愚蠢的功能,只需读取块和计算平均值。到目前为止,我已经尝试了以下策略:

  • 只读取重叠块的第一部分,丢弃第二部分。
  • read-chunk注意 blob 边界,以便它可以在适当的地方移动到下一个 blob 。
  • 使用环形缓冲区之类的东西,这样重叠的块就可以环绕边缘。

第一个选项是最简单的,但不能令人满意,因为它丢弃了潜在的重要信息。由于read-chunk经常被调用,我不想用太多的分支逻辑来负担它,所以第二个选项也没有吸引力。使用环形缓冲区(或类似的东西)似乎是一个优雅的解决方案。我设想的是一个生产者,它从 blob 中读取中等大小(比如 256 字节)的块到一个 1k 的缓冲区中,然后是一个调用read-chunk缓冲区的消费者,在适当的地方环绕。由于我将始终处理 2 的幂,因此生产者将始终与缓冲区的边缘对齐,并且我还可以避免使用mod它来计算生产者和消费者的索引。

我正在使用 Lisp (CL),但由于这似乎是一个通用的算法或数据结构问题,所以我将其与语言无关。我感兴趣的是澄清我有哪些选择 - 除了我列出的选择之外,还有其他选择吗?

4

0 回答 0