问题解释
我将使用 wbadmin 创建的 Windows 磁盘映像存储在 NTFS 驱动器上,我发现使用 NTFS 压缩进行压缩可以节省 1.5-2 倍的空间,同时仍然可以完全恢复。
但是在压缩过程中,文件会变得非常碎片化,系统磁盘映像通常有超过 100,000 个碎片。
由于碎片太多,碎片整理需要很长时间(每个图像需要几个小时)。有些碎片整理程序甚至无法处理,它们只会跳过文件或崩溃。
我认为,问题的根源在于文件是由单独保存的块压缩的。
问题
有没有好的(快速的)方法可以对图像文件进行碎片整理,同时保持其压缩状态(或压缩后不造成极端碎片化)?可能是某些实用程序可以快速对文件进行碎片整理以保留连续的可用空间,或者某些实用程序(或方法)可以从现有的非压缩文件创建无碎片的压缩文件?
根据评论/答案的备注:
外部(Windows 内核)压缩工具对我来说不是一个选择。它们无法即时解压文件(要解压 10 Gb 文件,我需要 10 Gb 的可用空间,而这并不总是可用的;而且,这需要很长时间);当系统从 DVD 启动进行恢复时,它们无法访问(这正是我需要可用映像的时候)。请不要提供它们,除非它们在 ntfs 上创建透明压缩文件,例如
compact.exe
。NTFS 压缩对于系统映像来说并不那么糟糕。除了碎片化之外,它相当不错。而且解压不会占用太多 CPU 时间,仍然减少了 IO 瓶颈,这在适当的情况下(非碎片化压缩文件具有显著的比率)可以提高性能。
碎片整理实用程序会对文件进行碎片整理,而不考虑文件是否经过压缩。唯一的问题是碎片数量,无论碎片文件是否经过压缩,都会导致碎片整理失败。如果碎片数量不多(大约 10000 个已经可以了),压缩文件将被碎片整理,并保持压缩状态和完整性。
NTFS 压缩率可能很高,具体取决于文件。系统映像通常最多压缩到其原始大小的 70%。
对于那些不相信的人,这里有一对屏幕截图,但当然,你可以自己进行测试。
我实际上从 NTFS 压缩映像(碎片化和非碎片化)进行了恢复,它有效,请相信我或自己检查一下。rem:正如我一年前发现的那样,它在 Windows 8.1 中不起作用。它仍然适用于 Windows 7、8 和 10。
预期答案:
适用于 Windows 的工作方法或程序,用于:
压缩文件(使用 NTFS 压缩,并保持 Windows 恢复可访问)而不会产生大量碎片(可能到另一个分区或制作压缩副本;它在 HDD 上的速度必须至少比
compact
+快 3 倍defrag
),或者
快速(至少比硬盘上的 Windows 碎片整理快 3 倍)对碎片严重的文件进行碎片整理,例如包含 100K+ 个碎片的文件(碎片整理后必须保持压缩状态)。
答案1
避免碎片化
秘诀是首先不要将未压缩的文件写入磁盘。
事实上,在您压缩一个已经存在的大文件后,由于 NTFS 就地压缩算法的性质,它将变得非常碎片化。
相反,您可以通过让操作系统在将文件写入磁盘之前动态压缩文件内容来完全避免此缺点。这样,压缩文件将像任何普通文件一样写入磁盘 - 不会出现意外间隙。为此,您需要创建一个压缩文件夹。(您可以用标记要压缩的文件的方式标记要压缩的文件夹。)之后,写入该文件夹的所有文件都将被动态压缩(即以压缩块流的形式写入)。以这种方式压缩的文件最终仍会有些碎片化,但这与就地 NTFS 压缩造成的混乱相去甚远。
例子
NTFS 压缩232Mb 系统映像至125兆字节:
- 就地压缩产生了巨大的2680碎片!
- 创建即时压缩19碎片。
碎片整理
确实,NTFS 压缩文件可能会给某些碎片整理工具带来问题。例如,我通常使用的工具无法有效地处理它们 - 速度慢得像爬行一样。不用担心,老牌的重叠群从系统内部快速、轻松地对 NTFS 压缩文件进行碎片整理!
答案2
阅读维基百科上关于NTFS 压缩:
文件以 16 簇块的形式压缩。对于 4 kB 簇,文件以 64 kB 块的形式压缩。如果压缩将 64 kB 数据减少到 60 kB 或更少,NTFS 会将不需要的 4 kB 页面视为空的稀疏文件簇 — 不会写入它们。
这允许合理的随机访问时间 - 操作系统只需遵循片段链。
然而,大型可压缩文件会变得高度碎片化,因为每个小于 64KB 的块都会变成一个碎片。
首先要做的事。管理员本质上是一个可以恢复整个系统的备份实用程序。因此,它的输出文件可能很大(> 4 Gb)。如引文所示,大文件很快就会变得碎片化。这是由于 NTFS 的压缩方式:不是按文件压缩,而是按扇区压缩。
一个很好的类比是将蛋糕分成几个盒子,其中一些盒子不是空的。这是初始文件。压缩部分挤压蛋糕碎片,在盒子中留下空间。由于蛋糕碎片没有聚在一起,因此由于产生的空间,组成蛋糕的碎片会变得碎片化。
我仍然对 NTFS 给出的这种压缩率持怀疑态度。根据最大压缩在多个文件上,NTFS 的压缩率得分最低,只有 40%。从个人经验来看,我可以告诉你,它的压缩率要低得多,事实上,低到我从来没有用过它,也没有看到它的效果。
避免碎片化的最佳方法是停止依赖 NTFS。大多数碎片整理程序都无法扩展或移动压缩文件。如果它们以某种方式做到了,NTFS 就无法扩展文件,或者即使可以,因为碎片整理过程会填充压缩后剩余的空间(4kB),扩展会使文件碎片化,因为文件不会写入之前连续的簇中。
话虽如此,如果您不需要不断读取文件,请使用上述链接中推荐的一些格式。7z 和 rar 非常高效(即它们在适当的时间内以高比率压缩)。如果您关心空间而不是时间,那么请选择 PAQ 类型的算法(尽管您将花费很长时间来压缩和解压缩文件)。还有快速算法可用。
如果你确实需要不断读取文件,就不要压缩它。NTFS 实在是太乱了。
答案3
虽然不完全是 OP 所要求的,但我对名为 Paragon 的第三方软件有很好的体验。按定义,当您压缩(有时甚至是写入)文件时,NTFS 会严重破坏您的文件系统。这会扩展到消耗多个 MFT 条目,并且...这很糟糕。当文件进行碎片整理时,Microsoft 的 NTFS 驱动程序甚至不会清理它。因此,需要第三方工具。Paragon 允许您将其作为操作系统本身(ISO 映像)启动,或安装到可以访问目标文件系统的另一个 Windows 操作系统中。然后,您可以对 MFT 和文件进行碎片整理。据我所知,这是修复 NTFS 中此缺陷的唯一方法,除非重新格式化卷。
(我与该工具及其创建者没有任何关系,只是我发现它是唯一真正有用的东西)
今天,在这个问题被提出两年后,我更愿意推荐重复数据删除 - 如果图像只是“一点点”不同,这可以为您节省 90% 以上的磁盘空间。虚拟机内的 W2016 Nano Server 运行得很好,但我认为 FreeNAS 或使用 ZFS 的其他任何东西都可以处理它。
答案4
Windows 最近将 ZIP 文件视为文件夹。ZIP 文件比 NTFS 压缩文件压缩程度更高,并且与 NTFS 不同,ZIP 文件本质上不会产生碎片。
为什么不通过使用 7-zip 压缩 ZIP 格式来测试您的一个磁盘映像并看看它是否可以直接用于恢复?
如果没有,请使用 7-zip 压缩参数,使用任何最佳格式(例如 7z)来最大化压缩。您可以将压缩率提高到远超 NTFS 的水平,从而多得多磁盘上的可用空间 - 尽管解压缩到第二个物理磁盘或 RAM 是最快的,最好是在不同的控制器和 IO 电缆上。
值得一提的是,压缩对于非 Sandman SSD 的系统磁盘和非媒体文件来说大有裨益 - SSD 的磨损更少、空间更大、非压缩文件的 I/O 速度更快。请参阅http://www.tomshardware.com/reviews/ssd-ntfs-compression,3073-9.html
视频、图形和其他压缩数据文件(如 .XLSX)已经非常压缩,因此 NTFS 压缩对这些文件没有任何好处。对于数据库或随机更新的 Outlook 邮件也是如此。但可执行文件、txt、html 等文件则受益匪浅。
对于小文件来说,压缩也是一种万全之策,例如,如果压缩后文件大小小于 64K,则只有一个碎片。唯一的麻烦就是如果磁盘出现问题,则需要进行恢复。