1
3
我会尝试回答你的问题,因为我有同样的任务,但在SD卡,这仍然是一个闪存。 简短的回答您只能在闪存中写入512字节的整页。考虑到闪存的写入计数很低,驱动芯片正在进行缓冲/随机化,以提高驱动器寿命。 要在闪存中写入一位,必须先擦除它所在的整个页面(512字节)。因此,如果你想在某个地方添加或修改1字节,首先它必须擦除它所在的整个页面。 该过程可总结为:
冗长的回答扇区(页面)基本上取决于闪存实现和闪存物理驱动程序的硬件,您无法控制这些硬件。每次你改变一些东西时,必须清除并重写该页。 您可能已经知道,如果不清除并重写整个512字节,就无法重写页面中的一个位。现在,闪存驱动器在扇区损坏之前的写入周期寿命约为10万。为了提高寿命,通常是物理驱动程序,有时系统将采用写入随机算法,以避免总是写入同一扇区。(顺便说一句,永远不要在SSD上进行碎片整理;这是无用的,最多可以缩短寿命)。 关于集群,这是在与文件系统相关的更高级别上处理的,这是您可以控制的。通常,格式化新硬盘时,可以选择群集大小,在窗口中,群集大小指的是格式化窗口的“分配单元大小”。
据我所知,大多数文件系统都使用位于磁盘开头的索引。该索引将跟踪每个集群以及分配给它的内容。这意味着一个文件将占据至少1个扇区,即使它小得多。
现在的权衡是,扇区大小越小,索引表越大,占用的空间就越大。但是如果你有很多小文件,那么你会有更好的占用空间。 另一方面,如果您只存储大文件,并且希望选择最大的扇区大小,只需略高于您的文件大小。 因为您的任务是执行日志记录,所以我建议您登录一个大扇区大小的大文件。在尝试过这种类型的日志之后,在单个文件夹中拥有大量文件可能会导致问题,特别是当您在嵌入式设备中时。 实施现在,如果您有对驱动器的原始访问权限,并且想要真正优化,则可以直接写入磁盘,而无需使用文件系统。 好的一面 *将为您节省相当多的磁盘空间 *如果您的设计足够聪明,将使磁盘在出现故障时具有容错能力 *如果您在有限的系统上,将需要更少的资源 在不利方面 *更多的工作和调试 *该驱动器不会被系统本地识别。 如果你只记录,你不需要有一个文件系统,你只需要一个页面的入口点来写入你的数据,这个入口点会不断增加。 我在SD卡上的实现是在闪存请求时保存100页,以存储有关写入和读取位置的信息。这是在一个页面中保存的,但为了避免内存周期问题,我会在100个页面上依次写入一个循环方法,然后使用一个算法来检查最后一个包含最新信息的页面。 位置存储每5分钟左右完成一次,这意味着在停电的情况下,我只会丢失5分钟的日志。在进一步写入之前,还可以从最后一个写入位置检查进一步的扇区是否包含有效数据。 这提供了一个非常健壮的解决方案,因为它们不太可能发生表损坏。 我还建议缓冲512字节并逐页写入。 其他您可能还想检查一些特定于日志的文件系统,他们可能会简单地为您完成工作: Log-structured file system |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |