为什么“大小”和“磁盘大小”之间有如此大的差异?


302

如下所示,文件夹中的“ 大小”“磁盘大小”字段之间有很大差异。这是为什么?

屏幕截图显示了1,504个文件夹中的50,875个文件,其中105 MB磁盘为1.43 GB

我知道由于Windows中的分配单位,磁盘上的Size应该比Size大一点,但是为什么会有如此大的差异呢?可能是因为文件数量大吗?

顺便说一句,这个文件夹在我的Android手机的SD卡上。在此内部,我的地图应用程序存储了其缓存的地图,并且该应用程序从Google Maps获取其地图。


10
您好thelastblack,您好,欢迎来到超级用户。我编辑了您的问题,以删除有关碎片整理的部分,因为两个现有的答案都集中在磁盘差异的大小/大小上,并且当每个发布的问题都是关于单个问题时,Stack Exchange格式效果最佳。当然,您当然可以将其作为一个单独的问题再次提出,尽管我认为到目前为止您在此问题上收到的答案表明碎片整理将无济于事。(通常在固态媒体上也无济于事。)如果您觉得我以任何方式改变了意图,请随时进一步编辑您的问题。
2014年

1
@MichaelKjörlingHeh,我只是在关于片段化的小型讨论中进行了编辑(请稍稍分散注意力)
Bob

21
@MichaelKjörling 不要追溯性地编辑问题以适合答案。答案之一解决了OP问题的分散部分。您的编辑需要回滚以避免混淆。
DanteTheEgregore 2014年

5
@DanteTheEgregore如果您指的是Bob的答案(确实已经过编辑,还讨论了碎片的影响),那么在跳枪之前,请检查该答案和问题的编辑历史和时间戳。在我进行编辑时,Bob的回答根本没有涵盖零散的问题。如果OP希望这样做,请重新编辑“对媒体进行碎片整理可以帮助我吗?” 应该解决任何悬而未决的混乱,尽管我仍然认为最好单独提出一个问题;IMO的两个值之间的差异无关紧要。
2014年

11
在我看来,这个应用程式的程式设计严重错误-请考虑提交错误报告。我绝对不是专业的程序员,但是我曾经在JavaME中一起破解过类似的东西,当然,我必须解决的问题之一是如何将所有这些小的地图图块有效地存储(存储和访问)在容器中。我最终使用了未压缩的zip文件。
A. Donda 2014年

Answers:


303

我将假设您在这里使用FAT / FAT32文件系统,因为您提到这是SD卡。NTFS和exFAT在分配单位方面表现相似。其他文件系统可能有所不同,但是Windows仍然不支持它们。

如果您有很多小文件,这肯定是可能的。考虑一下:

  • 50,000个文件。

  • 32 kB群集大小(分配单位),这是FAT32的最大值

好的,现在最小占用空间为50,000 * 32,000 = 1.6 GB(使用SI前缀而不是二进制,以简化数学)。每个文件在磁盘上占用的空间始终是分配单元大小的倍数-在这里,我们假设每个文件实际上足够小以适合单个单元,并留有一些(浪费)空间。

如果每个文件的平均大小为2 kB,则总共将获得100 MB的空间-但由于分配单元的大小,平均浪费了15倍(每个文件30 kB)。


深入的解释

为什么会这样?好了,FAT32文件系统需要跟踪每个文件的存储位置。如果要保留每个字节的列表,则表(如地址簿)将以与数据相同的速度增长-并浪费大量空间。因此,他们要做的是使用“分配单位”,也称为“集群大小”。卷被划分为这些分配单元,就文件系统而言,它们不能被细分-这些是它可以处理的最小块。就像您有门牌号码一样,但邮递员并不在乎您有多少间卧室或住在其中的人。

那么,如果文件很小,会发生什么?嗯,文件系统不在乎文件是0 kB,2 kB甚至15 kB,它会为它提供最小的空间-在上面的示例中为32 kB。您的文件仅使用了少量的空间,其余的基本上被浪费了,但仍属于该文件-就像您闲置的卧室一样。

为什么会有不同的分配单位大小?好吧,这是一种权衡取舍,要有更大的桌子(例如通讯录,例如说约翰在假街123号,假街124号,撒旦巷666号等处拥有房屋),或者在每个单元(房屋)中浪费更多的空间。如果文件较大,则使用较大的分配单位更有意义-因为在所有其他文件都填满之前,文件不会获得新的单位(房屋)。如果您有很多小文件,那么无论如何,您都将有一张大桌子(地址簿),因此也可能给他们小的单位(房子)。

通常,如果您有很多小文件,则大的分配单元将浪费大量空间。通常,通常没有充分的理由要超过4 kB。


碎片化?

至于碎片,碎片不应以这种方式浪费空间。大文件可能会被分割成多个分配单元,也就是将其拆分成多个分配单元,但是每个单元都应该在下一个分配单元开始之前被填充。碎片整理可能会在分配表中节省一些空间,但这不是您的特定问题。


可能的解决方案

正如gladiator2345所建议的那样,此时您唯一真正的选择是使用它或使用较小的分配单元重新格式化。

您的卡可能采用了FAT16格式,这对表大小有较小的限制,因此需要更大的分配单位才能处理更大的卷(对于32 kB分配单位,上限为2 GB)。来源Braiam提供。如果真是这样,您仍然应该能够安全地将其格式化为FAT32。


3
实际上,由于最小分配大小而造成的浪费空间实际上被称为“内部碎片”,因此您可以说碎片是罪魁祸首。但是,任何“碎片整理”工具仍然无能为力。
hobbs 2014年

3
(从技术上讲,它很少被称为“松弛”。)
hobbs 2014年

1
群集大小也限制了最大文件系统大小。例如,如果您的地址空间是32位,则总共有大约42.9亿个群集。现在,如果使用NTFS支持的最小群集大小(512字节),则可以寻址最大512 * 2 ^ 32字节= 2 GiB。如果需要一个可以存储2 GiB以上数据的卷,则必须增加群集大小。所有这些都与您尝试存储的实际最大文件无关,只要您不能存储大于2 GiB的文件(这是最少的问题)即可。
Andon M. Coleman 2014年

4个KiB群集可让您寻址最大不超过16 TiB的卷中的文件,这在可预见的将来应该足够了。
Andon M. Coleman 2014年

1
好吧,他可以将小文件的存档压缩为一个大文件。
einpoklum 2014年

45

这是压缩/存档到单个文件中可能会帮助的情况之一。什么鲍勃在他的回答说是真实的,但解决方案可能比reformating盘其他答案建议更容易。如果压缩或存档目录(使用zip,tar或任何其他方法),则文件系统将看到您只有一个大文件,而不是几个较小的文件。即使不进行压缩,您也将获得近1.4 GiB的空间,因为所有这些“小文件”将被计为一个大文件。

在此内部,我的地图应用程序存储了其缓存的地图,并且该应用程序从Google Maps获取其地图

也许您应该与开发人员讨论使用存档或数据库而不是多个文件。这可能也将有助于减少磁盘碎片,并肯定会节省空间,特别是如果它是NAND闪存驱动器。如果您解释了100MB有效负载/有用数据变为1.4GiB的荒谬情况,则数据的存储方式存在问题,开发人员应提出更好的解决方案。


1
>在其中,我的地图应用程序存储了其缓存的地图,并且该应用程序从Google Maps获取其地图。-不幸的是,在这种情况下,压缩(实际上是高于基本版本的文件系统)需要此映射应用程序的支持。
鲍勃

1
@Bob,则解决方案应来自开发者D:
Braiam 2014年

4
完全是真的。我认为暂时应该更改我的应用。
vfsoraki 2014年

17
@Braiam并不是在欺骗文件系统,以为只有一个文件。还有就是只有一个文件。关于为什么开发人员不将缓存信息存储在档案中的原因,可能是因为大多数档案格式都不是为缓存肯定需要的快速随机写入而设计的。更好的选择可能是使用轻量级的数据库库,例如SQLite。
bcrist 2014年

1
绝对正确..... +1
arundevma 2014年

25

万一有人遇到此问题,知道另一个在磁盘上的文件大小/空间有很大差异的另一个原因可能是有用的,即使用备用数据流(ADS)

据我所知,这仅适用于NTFS。ADS既有合法用途,又有不合法用途:

  • 将文件标记为从Internet下载
  • 存储元数据(Microsoft希望包括某些Apple OS功能,例如不使用文件扩展名来确定文件类型)
  • 隐藏恶意软件中的数据或代码

简单地使用ADS:任何NTFS文件都可以容纳多个数据流(理解“子文件”)。一个是主流,由Windows资源管理器和其他Windows工具使用,它包含文件的常规内容。备用数据流可能包含与主流完全相同的其他信息,但是Windows工具无法直接处理它们(特别是资源管理器将文件大小显示为等于主流的大小,而与ADS的大小无关),您必须使用专门的工具或代码来编写,读取和定位ADS。

要点是,如果观察到较大的文件大小差异,请不要忽略ADS和隐藏的恶意软件的可能性。

另一个环节

为了安全地试用ADS,请在DOS / CMD级别上尝试此操作...

创建并在C的根目录中显示文件的内容:

C:\> echo The main data stream> test.txt
C:\> type test.txt

结果:

C:\> The main data stream

现在,使用相同的方法添加ADS,只需在文件名之外指定ADS名称即可:

C:\> echo The secret message> test.txt:secret

您刚刚将秘密消息隐藏在文件中。请注意,尽管我们在ADS“秘密”中添加了字节,但资源管理器中的文件大小并未更改。

尝试显示ADS内容:

C:\> type test.txt:secret

结果:

The filename, directory name, or volume label syntax is incorrect.

CMD type无法显示ADS的内容。我们将改用记事本:

notepad test.txt:secret

在记事本中,我们可以看到ADS的内容:

The secret message

您也可以将完整的可执行文件隐藏在纯文本文件的ADS中,然后随时运行它。财富对黑客无害:-)


我自己不是一个赢家,我的工作大部分是在Linux上完成的。这非常有用。谢谢
vfsoraki 2014年

4
值得使用Sysinternals的 Streams之类的工具来检查ADS的使用情况。例如,在Windows系统上下载的文件可能会用ADS中的源标记,尽管它很小,并且不应占用空间。它通常不会显示在dir或Explorer输出中。它可能占用很多块,并加剧了您正在调查的磁盘使用问题。。
adric 2014年

19

问题可能是由于群集大小。

根据微软的说法:

如果您不对卷中包含的任何文件或文件夹使用NTFS压缩,则SIZE和SIZE ON DISK之间的差异是浪费的空间,因为群集的大小超出了必要。您应尝试使用最佳群集大小,以使SIZE ON DISK值尽可能接近SIZE值。SIZE ON DISK和SIZE值之间的差异过大表示默认群集大小对于卷上存储的平均文件大小而言太大,应该减小它。只能通过备份该卷,然后使用format命令和/ a开关来指定适当的分配大小来重新格式化该卷,以完成此操作:IE :(format D: /a:2048 此示例使用2 KB群集大小)。

尝试使用较小的群集大小格式化驱动器。


4
话虽这么说,但不应使集群的大小小于4096字节,或仅不等于该数字的倍数。32位OS可以处理4096字节的页面(在非PAE情况下),因此使用非多个群集可能会对文件系统性能产生负面影响。这就是为什么默认大小设置为4096字节的原因。
Ruslan 2014年

2
为了补充@Ruslan所说的内容,较新的硬盘驱动器现在具有4 kB的扇区大小,将文件系统与物理扇区对齐是最佳选择,并且物理扇区大小应为分配单元大小的倍数。
鲍勃

1
@Ruslan我相信您的意思是说它应该是4096的两倍。12288(3×4096)和20480(5×4096)并不是很好的选择。
斯科特

9

我看到许多人建议使用较小的群集大小重新格式化驱动器。由于这是SD卡,因此请注意,许多供应商都将卡预格式化为建议的群集大小,以与NAND群集大小相匹配(保持同步对于获得最佳的读/写性能和减少磨损非常重要)。

您无法更改NAND的群集大小(这是SD卡硬件的物理属性)。

首先在SD卡上运行scandisk / chkdsk,以确保大小报告问题不存在于损坏的文件系统中。

其次,建议您将错误报告给Google Map开发人员,因为这是他们的责任。他们应该使用更好的存储方法。修复它还应该使该应用程序在I / O和文件系统的驱动程序活动较少的情况下在许多设备上更快地运行。


实际上,它不是Google Maps,而是另一个使用Google Maps的应用程序。我通知开发人员,并刚刚从我的SD中删除了这些文件。
vfsoraki 2014年

7

这是许多文件系统的普遍问题。这里有两个因素在起作用,文件系统每个逻辑卷可以处理的“块”的最大数量以及存储介质的物理限制。只能将1个文件分配给任何给定块(文件通常占用所需数量的块)。因此,具有64个字节的文本文件通常可以占用4k至32k的任何空间,具体取决于其所在文件系统的块大小。

考虑这种情况的一种方法是将文件系统中的每个块视为一个盒子,将文件系统视为一个房间。您所有的盒子都一样大小,并且您要尽可能地容纳一个房间。如果将它们全部容纳而剩下更多空间,则必须获得更大的盒子,以便房间完全充满盒子。

将物品放入盒子的规则之一是您不能将两个无关的物品放入盒子。它们必须是同一文档的一部分。因此,如果我要键入一页文字,它将有它自己的框。如果我输入的文字有太多页面,我无法将所有内容都放在一个盒子中,那么我会简单地找到另一个盒子,然后继续放置页面,重复一次,直到将所有页面归档为止。我还要写下用于该文档的框以及按顺序读取框的顺序。

根据我整理箱子的方式,清单中可能只有足够的空间容纳一定数量的箱子。因此,如果我有一个大房间要装满,但只有少量的箱子,我将不得不使用非常大的箱子才能达到房间的容量。

因此,在那种情况下,我的一页文档仍将占据一个框,没有其他共享框。

在各种存储解决方案中也会出现相同的情况。FAT32仅能管理当今巨大的硬盘驱动器上很少的“盒子”,因此它最终以非常大的“盒子”来弥补。


6

除群集大小外,由于以下情况,您可能还会出现差异:

  • 压缩或加密的文件可能会占用与逻辑文件大小不同的空间。
  • 链接文件将报告n倍于链接数乘以文件大小得出的逻辑文件大小,但是通常使用的物理空间会更少。

通常,这可能是正确的。但就我而言,高分配单元是个问题。
vfsoraki

3
是的,我只是想通过给出更多可能的差异原因来增加答案。
Archimedes Trajano 2014年

6

您应该查看Wikipedia中的“块子分配”条目。这就是你正在发生的事情。使用文件系统支持尾包包装是解决此问题的文件系统级解决方案,除了更改分配群集的大小。

所有这些都有需要重新格式化磁盘的不便之处。

在某些情况下,仅将这些文件存储在存档中即可解决此问题(小文件除了在文件末尾停止丢失空间外,还将被压缩)。这花费了一些时间进行减压的不便。

如果由于某些与应用程序相关的特定问题而导致文件太多,则另一个选择是使用另一种方法(可能在数据库中)存储软件数据。但这当然是针对程序员而非最终用户的解决方案。

http://en.wikipedia.org/wiki/Tail_packing


0

我注意到单个文件在Windows 10中存在巨大的文件大小差异,但是如果从Windows XP的同一位置(网络驱动器)查看SAME文件的属性,则不会存在较大差异;只是很小的差异,这就是您所期望的。我认为Windows 10中存在一个错误。一个449MB的文件可能不会占用3.99GB,这就是Windows 10告诉我的。


1
只是一个供参考,该问题无关与Windows 10 OP使用的是Windows 7
TheKB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.