3

我必须在闪存设备(MMC 卡)上写入一个不断增长的日志文件,而且我担心闪存磨损。

假设我使用fopenstd::ofsteam::open以写入/追加模式打开日志文件。该文件当前大小为 10MB。如果我只继续追加到文件,我可以确保文件系统不会尝试将之前的 10MB 重新写入新的闪存块吗?

如果不清楚,我可以用不同的方式问同样的问题。考虑这种情况:

  1. 创建一个名为“log.txt”的新文件
  2. 将 10kB 附加到文件中
  3. 关闭文件
  4. 其他进程写入同一磁盘/分区上的不同文件
  5. 重新打开“log.txt”
  6. 将另外 10kB 附加到文件中
  7. 关闭文件

这是否与这种情况具有相同的效果(就闪光磨损而言):

  1. 创建一个名为“log.txt”的新文件
  2. 将 20kB 附加到文件中
  3. 关闭文件
4

2 回答 2

3

大多数闪存文件系统将具有内置的磨损均衡系统,因此不会反复使用同一部分的闪存。

并且附加应该不是问题,因为(我希望)在存储信息时不会“磨损”写入新数据 - 你只会在“擦除”周期中磨损,这只会在你删除文件时发生[和文件所在的扇区需要用新数据重写——如果不被替换,删除内容毫无意义]。

为了回答您的实际问题,最好使用附加模式而不是编写另一个新文件。至少你没有“磨损”已经写入的文件部分——并且在闪存方面碎片不应该成为问题——访问字节 0、1、1000 和10000000000000,而不是旧式硬盘驱​​动器,其中机械头必须移动以获取下一个数据块每隔几次读取,并且更长的移动需要更长的时间。

于 2013-08-07T19:08:56.387 回答
1

如果我只继续追加到文件,我可以确保文件系统不会尝试将之前的 10MB 重新写入新的闪存块吗?

这取决于闪存文件系统。与您的愿望相反,有时重写一些以前的 10MB 实际上是件好事。即,执行磨损均衡。每个闪存芯片都有一个扇区擦除块大小。这些在磨损均衡中发挥作用。每个擦除块在生命周期内都有最大数量的循环。如果您的 10MB 文件几乎是完整的闪存,那么移动一些扇区以便在那里进行新的擦除是有意义的。这在维基百科的磨损均衡页面上称为静态磨损均衡。

闪存芯片的典型擦除周期为 10k-10M。因此,通常,闪存文件系统应将所有扇区擦除调整为 +/- 1k。大多数磁盘都有长寿命数据和短寿命数据。希望这可以解释移动长寿命数据的必要性。

此外,许多闪存文件系统支持压缩。追加时,应尽量将块保持在扇区大小或压缩块大小的最大值。在 C++ 层,这自然会在任务级别的内存中缓冲。您可以将缓冲区大小设置为匹配和/或仅flush()在您确定已写入完整扇区时调用。写入部分扇区(或压缩块)的问题在于,这将留下许多部分写入,直到填满完整的擦除块。然后将擦除所有部分写入。

您不必在应用程序级别注意这一点,但是像这样更改您的日志记录可以显着延长闪存的寿命。当然,一切都在一定程度上取决于闪存文件系统。并非所有人都会移动静态数据以确保擦除磨损均衡。他们只能在自由区域进行磨损均衡;或未使用的闪存空间。

于 2013-08-08T13:52:56.560 回答