1

我有一个持久性字典(字符串-> 字符串映射),我将其作为日志文件写入 NAND 文件系统。我的二进制格式是:

1 byte - key size
<key size> bytes - key without the terminating nul-character
2 bytes - value size and flags
<value size> bytes - value without terminating nul-character

通常,字典中的每次更改我都会写 20 到 100 个字节。但是由于这是在 NAND 上保留的,因此这种设计会导致每次分配一个新页面,从而在每次迭代中将我的可用 NAND 空间减少 2k。

我不能缓存写入,因为我不能丢失这些数据。它是销售终端的运行点,保存交易数据。我的算法有效地写入和调用刷新,所以这不会发生。

现在,是否有一个事实上的或标准的算法来解决这个问题?我查看了目标平台上的断电触发器,但 SDK 建议使用 NAND 作为持久层。

4

2 回答 2

0

嗯......只需跟踪您在页面中的位置,在写入之前,读取最后一页,将新数据附加到内存中,然后将相同的页面写回。

如果新数据超出页面限制,请从新页面开始。如果新数据不适合写入最后一页的剩余空间,则会发生这种情况。完成后,更新有关上次写入发生位置的信息。

您说您的附加“每次都会分配一个新页面”,我不确定如果您要附加到字节序列,为什么会出现这种情况。

当然,这需要对内存进行页级访问。如果您只有文件级(如 C 的FILE *函数)访问,除非您知道您的文件层有些聪明,否则您不能这样做。

于 2012-09-26T13:57:36.173 回答
0

由于 NAND FLASH 在写入时仅限于页面粒度,所以我不走运。我可以依赖一些外部持久设备或关机例程,但我无法访问任何其他辅助存储器,旧的销售点终端甚至有电容器用于最后的例程,但它们对于交易来说不够可靠数据。

我将不得不忍受 FLASH 的限制。

于 2012-10-05T18:14:52.427 回答