闪存搜索字符串

Flash memory search string

闪存用于记录帧:$D 数据、$E 错误和 $R 报告等等。每帧在帧类型后都有时间戳:$D,Timestamp.......$E。所有数据均为十六进制且长度可变,即 0 = 0, 1587912486= 5EA59F26,它不是定长帧。时间戳是 UDT1970。

注意:在 Flash 中,每页为 256 字节。

到目前为止,我从开始页面和结束页面之间的中心页面开始,它在该页面上寻找(通过 $D 匹配)并读取时间戳(逐字节读取闪存到数组,直到检测到“,”)每页的开始。如果时间戳小于或大于目标时间戳,它会跳到下半页编号(步骤)并重复直到步骤转到 1。然后我返回一页并逐字节向上搜索时间戳,直到找到实际匹配。这是两个过程:页面跳转搜索,然后逐字节搜索。

我很好奇是否有特定名称下的类似算法或针对闪存搜索优化的更好算法。注意:我在 SRAM 使用方面有一个限制,即转移到大缓冲区不是一个选项。

在我看来你在那个时间间隔内开始了 运行 binary search until you find the interval containing your key, and then run a linear search

如果您的采样率或多或少是恒定的,您可以使用 interpolation search 更快地归零到正确的间隔,但它对插值的准确性非常敏感,这取决于采样的均匀性。

快速搜索(和精确插值)最明显的障碍是可变的帧大小:如果你可以固定大小而不浪费太多space,或者写一个单独的索引(本身有固定的-大小的记录,无论是适合 SRAM 的小记录,还是也存在于闪存中),应该更容易。

例如,您可以保留一个可快速搜索的索引来存储时间戳+索引(只是一个用于二进制或插值搜索的数组,或者树或跳跃列表,或其他东西)。然后你有一个固定偏移量的快速查找,以及对可变大小数据的间接访问。