我使用 USB 拇指驱动器备份我最重要的数据。我注意到有些文件写入速度非常慢,我终于意识到它们有什么不同。这些文件正在被覆盖。
例如,邮箱文件从一个备份变为另一个备份。一个叫做 IN.MBX,另一个叫做 OUT.MBX
覆盖原始文件非常慢。但我可以立即删除旧文件,然后复制新文件。这些文件有数百 MB,但闪存驱动器在复制大文件时速度很快。
有人在这里问了类似的问题为什么复制比覆盖更快?六年前,似乎没有人给出合理的解释。
有人知道这是为什么吗?每天备份的时候这有点麻烦。
答案1
这与闪存(相对于硬盘)的物理制造方式有关。
我引用自香料厂:
在闪存中,实际上不可能直接覆盖特定的物理数据位置。如果某个单元已存储数据,并且控制器决定需要在该位置写入新数据,则必须先擦除该单元,然后才能在该位置进行新的写入操作。擦除和写入在闪存中是电气上不同的操作。如果我们必须连续执行擦除和写入才能“覆盖”特定的存储数据,这将大大降低用户体验到的有效写入速度。
这与闪存驱动器的物理制造方式有关。擦除意味着:将该块的所有单元(=位)设置为 1。这需要高能量(即高电压)并且速度很慢。写入意味着:将某些位设置为 0。这需要较低的能量(较低的电压)并且速度更快。(根据具体技术,“0”和“1”可以反转)。
这实际上是我们将新数据写入未使用位置的主要原因。磨损均衡很重要,但 ERASE 和 WRITE 操作之间的这种区别占主导地位。
从引用来看,似乎您的特定闪存驱动器的控制器没有得到很好的优化。通常,闪存驱动器只会删除文件表中的旧条目,并将新文件写入其他位置。然后,当驱动器空闲时,那些包含旧数据的区域将被重置为 ERASED = 所有位均为 1。
但是,如果可用空间不足,这种行为可能会发生变化:在这种情况下,控制器可能必须先删除,然后擦除,然后写入。这是逐个文件进行的,因此显然,如果您首先以用户身份擦除这些文件,驱动器只需进行一次大的清空操作,这比在删除、擦除和写入操作之间切换要快。
而且:
我们可以在闪存中擦除的最小单位称为块(不要与文件系统级别的逻辑块混淆)。闪存块通常由 256 或 512 个页面组成,因此闪存块最大可达 8 MB。16kB
写入大小和 8MB 擦除大小之间的差异意味着存储设备固件在开始擦除 NAND 块时需要进行一些调整,以便释放 NAND 页面以供主机进行新的写入。这个过程称为垃圾收集。因此,当您删除或更改文件时,操作系统会将相应的逻辑块集标记为无效,这将引发一系列事件,最终导致旧数据被不可挽回地擦除。
你能做什么?
a) 购买具有更多空间的 USB 驱动器,以避免长时间的 ERASE 周期
b) 或者,如果您的驱动器已经足够大,请尝试其他制造商,他们可能有更好的“覆盖”命令算法(例如:覆盖=删除并在不同位置写入)
c) 购买小型外部 SSD,速度会快得多。
我会尝试找到几个月前读过的一篇综合性文章,并将其添加为参考
答案2
正如问题链接中的答案所说的那样,如果您想覆盖它,您不能简单地替换数据。
就像用铅笔在纸上写字一样,一旦写好,就不能再写,因为这样看起来会不对。所以你必须把它擦掉。
由于存在块/扇区,因此情况更加复杂。每次要覆盖某个块时,必须先擦除该块,然后再写入。
“擦除比写入慢。” -大卫·施瓦茨
例如[000000000000000000000000000000000000000000000000]
一个block,每个block有48bytes,理论上USB有5个block,存储量240B,擦写速度一样,都是1byte/s。
你创建一个名为“foo”的文本文件。它被写入第一个块。
前:
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
后:
[010001100100111101001111000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
因此一个块已被修改/写入。现在如果你想覆盖并且内容是“bar”。你首先必须将其擦除。(我不知道你是否将零归零)。
当前的:
[010001100100111101001111000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
归零:
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
擦除:
[111111111111111111111111111111111111111111111111]
[111111111111111111111111111111111111111111111111]
[111111111111111111111111111111111111111111111111]
[111111111111111111111111111111111111111111111111]
[111111111111111111111111111111111111111111111111]
写作:
[010000100100000101010010000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
如您所见,覆盖操作更多。如果您删除它,则只需删除文件指针,它就会作为原始数据存在。然后您只需擦除然后写入即可。
答案3
USB 接口很慢;USB 3.0(蓝色)比 USB 3.1(红色)慢,USB 2(黑色)更慢。
闪存驱动器中的 IC 类型与固态驱动器 (SSD) 中的不同。SSD 中的控制器运行多芯片驱动器的速度比单芯片闪存驱动器快得多。
写入新文件会比覆盖略快,因为写入所有块后,文件分配表会更新,以显示将重新使用原始文件版本使用的空间。不过,这只是工作量的小幅增加。
这个过程与我的博学同事 Jake Gould 的解释不同,而 1NN 则一针见血。使用闪存,您不会覆盖以前使用过的块;相反,会写入新文件,然后将先前的版本标记为 FAT 中的空置。