考虑到将 zip 文件夹复制到闪存驱动器后解压所需的时间,哪种方法更快?将压缩文件夹复制到 USB 闪存驱动器,然后在闪存驱动器上解压它们,还是仅将未压缩的文件夹复制到闪存驱动器。
不要考虑压缩文件所需的时间,因为文件在复制之前已经压缩了。我可以从 USB HDD 或 SSD 复制到 USB 闪存驱动器(两者均支持 USB 3.0)。
在这种特定情况下,我想要传输 9 个 zip 文件,总共有 115,518 个文件,其中大多数都是非常小的图像文件(这 9 个文件总计未压缩时为 15Gb,压缩后为 10 Gb)。
答案1
考虑到将 zip 文件夹复制到闪存驱动器后解压所需的时间,哪种方法更快?将压缩文件夹复制到 USB 闪存驱动器,然后在闪存驱动器上解压它们,还是仅将未压缩的文件夹复制到闪存驱动器。
可能是后者。
请记住,解压缩和其他类似操作都是由计算机的 CPU 完成的。您可以将数据复制到驱动器(无论是闪存还是硬盘)中,也可以将数据复制出来,但您无法让驱动器本身对其进行解压缩,或者执行任何其他操作。
因此,你的第一个计划将涉及:
- 将 10 GB 数据从磁盘复制到闪存
- 读取这 10 GB后退从闪存到 RAM
- 解压缩
- 将 15 GB 的解压数据从 RAM 写入闪存
- 删除步骤 1 后留下的无用压缩文件
第二:
- 直接从内部磁盘读取 10 GB 到 RAM
- 解压缩
- 将 15 GB 的解压数据写入闪存
请注意,第一个计划涉及两倍的读写操作。但不仅如此:实际上,步骤 2-3-4 不会按顺序进行,而是并行进行 - 这使得从一个驱动器读取并写入另一个驱动器时的过程更快,但当同一个驱动器同时进行读取和写入时,过程会慢得多。
答案2
哪种方式更快?将压缩文件传输到闪存驱动器然后在那里解压缩,还是传输解压缩的文件?
毫无疑问,正确答案是“转移联合国压缩文件”。
当然,传输所有文件的压缩包会更快,但你规定了额外的步骤“然后在那里解压”。
显然你没有意识到你不能“解压缩”本地驱动器或存储设备上。
必须读取源存档文件(无论其存储在哪里),然后 CPU 在主内存中执行解压缩。
因此,为了解压已传输到闪存驱动器的文件,必须从闪存驱动器中读取该文件、解压缩,然后将各个文件写入闪存驱动器。
最后一个步骤(写入单个文件)本身相当于后一种选择。因此,首先写入 zip 文件,然后读取它们(但可能通过缓存进行优化)的额外步骤应该使您的第一选择成为较长的操作。
看待问题的另一种方式是假设操作之间存在一定程度的并发性并猜测时间范围。
因此,对于情况 1,将 zip 文件复制到闪存驱动器需要读取操作与写入操作同时进行(但会有一些块延迟)。
写入也需要比读取更多的时间(例如,参见为什么将相同数量的数据分布在许多单独的文件中进行复制会花费更长的时间?)。
复制完成后,即可读取、解压缩并写回到闪存驱动器。
尽管读取、解压缩和写入操作是并发的,但总体时间线主要由写入所有未压缩文件的时间决定。
RRRRRRRRR
WWWWWWWWWW
rrr rrr rrr
DDDD DDDD DDDDD
WWWWWWWWWWWWWWWWWWWWW
time-->
案例 2 是直接读取、解压缩和写入。
此案例应需要相同的时间来写入所有未压缩的文件。
RRR RRR RRR
DDDD DDDD DDDDD
WWWWWWWWWWWWWWWWWWWWW
当读取操作的第一阶段是针对来自同一设备的相同量的数据,而写入操作的最后阶段是针对向同一设备写入相同量的数据时,您怎么能期望案例 1 比案例 2 完成得更快呢?
和
案例 1 是否因必须先执行复制而受到阻碍?
答案3
如果您想要解压到同一个驱动器 - 就不要费心压缩。如果您要解压到其他驱动器 - 可以考虑压缩,因为这样对文件系统的 IO 调用会更少(数据和文件实体更少)