顺便说一句,此文件夹位于我的Android手机的SD卡上。在其中,我的地图应用存储了缓存的地图,并且该应用从Google Maps获取其地图。
#1 楼
我将假设您在这里使用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格式进行格式化,这对表大小有较小的限制,因此需要更大的分配单元才能处理更大的容量(上限为2 GB, 32 kB分配单位)。来源由Braiam提供。在这种情况下,无论如何您都应该能够安全地将其格式化为FAT32。
评论
实际上,由于最小分配大小而造成的浪费空间实际上被称为“内部碎片”,因此您可以说碎片是罪魁祸首。但是,任何“碎片整理”工具都无法做任何事情。
–霍布斯
2014年1月23日下午6:21
(从技术上讲,它很少被称为“松弛”。)
–霍布斯
2014年1月23日下午6:21
群集大小也限制了最大文件系统大小。例如,如果您的地址空间是32位,则总共有大约42.9亿个群集。现在,如果使用NTFS支持的最小群集大小(512字节),则可以寻址最大512 * 2 ^ 32字节= 2 GiB。如果需要一个可以存储超过2 GiB数据的卷,则必须增加群集大小。所有这些都与您尝试存储的实际最大文件无关,只要您不能存储大于2 GiB的文件(这是最少的问题)即可。
–安东·科尔曼(Andon M. Coleman)
2014年1月24日20:23
4个KiB群集可让您寻址最大不超过16 TiB的卷中的文件,这在可预见的将来应该足够了。
–安东·科尔曼(Andon M. Coleman)
2014年1月24日20:31
好吧,他可以将小文件的存档压缩为一个大文件。
– einpoklum
2014年1月26日14:55
#2 楼
这是压缩/存档到单个文件中可能会帮助的情况之一。鲍勃在回答中说的是正确的,但解决方案可能比其他答案所建议的重新格式化磁盘更容易。如果压缩或归档目录(使用zip,tar或任何其他方法),则文件系统将看到您只有一个大文件,而不是几个较小的文件。即使不进行压缩,您也将获得近1.4 GiB的空间,因为所有这些“小文件”将被计为一个大文件。在其中,我的地图应用商店缓存的地图,然后该应用会从Google Maps获取其地图。
也许您应该与开发人员讨论使用存档或数据库而不是多个文件。这可能也将有助于减少磁盘碎片,并肯定会节省空间,特别是如果它是NAND闪存驱动器。如果您解释100MB有效负载/有用数据变为1.4GiB的荒谬情况,则数据的存储方式存在问题,开发人员应提出更好的解决方案。
评论
>在其中,我的地图应用程序存储了其缓存的地图,并且该应用程序从Google Maps获取其地图。 -不幸的是,在这种情况下,压缩(实际上是基础系统之上的文件系统)需要此映射应用程序的支持。
–鲍勃
2014年1月20日15:04
@Bob,那么解决方案应该来自开发人员D:
–脑袋
2014年1月20日15:12
完全是真的。我认为暂时应该更改我的应用。
–vfsoraki
2014年1月20日在16:34
@Braiam并不是在欺骗文件系统,以为只有一个文件。只有一个文件。关于为什么开发人员不将缓存信息存储在档案中的原因,可能是因为大多数档案格式都不是为快速随机写入而设计的,而缓存肯定需要这种格式。更好的选择是使用轻量级的数据库库,例如SQLite。
–律师
2014年1月21日,1:30
绝对正确..... +1
– arundevma
2014年1月21日在4:40
#3 楼
如前所述,大小差异的最常见原因是使用空间与分配空间。但这并不是唯一的可能性,NTFS具有一项向文件添加隐藏数据的功能。这种可能性是2019年底医疗保健行业勒索软件所利用的一种可能性。 (指令)和关联的资源(例如图标和菜单)在同一文件中。在可执行文件中嵌入资源是一种常见的技术,但是用fork却不是这样。 “备用数据流”(ADS)的名称。在NTFS中,文件包含:
强制性未命名数据流(UDS)
一个或多个可选备用数据流( s)(ADS)。
隐藏在文件中
文件派生还不错,除了NTFS ADS不被包括Windows资源管理器在内的通用工具所支持,ADS实际上是一项隐藏功能,这是给黑客的意想不到的礼物。摘自Wikipedia:
Windows资源管理器中未列出备用流,并且文件的大小未包含其大小
。
文件大小显示仅UDS大小,不会因ADS的存在而改变,分配的大小(文件系统分配给文件的簇)报告文件的实际大小,包括所有流。
Windows Explorer不报告ADS。 ,CMD命令
dir
都没有。但是,可以通过以下方式看到ADS:Powershell Get-Item -Stream(Windows)
CMD目录/ r(Windows)
流(Microsoft / SysInternals)
伙计们(Heysoft)
AlternateStreamView(NirSoft)
请注意,仍然可以通过使用文件系统保留的关键字从某些工具中隐藏ADS(请参见Pierce的文档在下面链接)。
Windows使用ADS标记从Internet下载的文件并存储其他元数据。
黑客使用ADS隐藏用于恶意活动的数据和代码。
< br值得一读的ADS的全面描述:Sean Pierce的
Marc Ochsenmeier的
ADS的恶意软件使用
许多严重的反恶意软件工具会监视ADS,但恶意软件仍在大规模使用ADS,因为:
很容易将合法文件的执行重定向到ADS(例如,使用快捷方式)。
BitPaymer
勒索软件BitPaymer作为普通的可见文件进入计算机,但是执行后会将其自身复制为ADS的合法文件,然后删除初始文件。由于这不会改变合法文件的大小,并且通用工具也未列出ADS,因此该恶意软件现在实际上已经被隐藏。
钴钴猫行动组织
也使用ADS隐藏。
我的重点是:如果观察到大文件大小差异(大于群集大小:4KB),请不要忽视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.
< br CMD type
无法显示ADS的内容。我们将改用记事本:notepad test.txt:secret
在记事本中,我们可以看到ADS的内容:
The secret message
您还可以将完整的可执行文件隐藏在纯文本文件的ADS中,然后随时运行它。财富对黑客无害:-)
评论
我自己不是一个赢家,我的工作大部分是在Linux上完成的。这非常有用。谢谢
–vfsoraki
2014年1月21日,9:47
值得使用Sysinternals的Streams之类的工具来检查ADS的使用情况。例如,在Windows系统上下载的文件可能会用ADS中的源标记,尽管它很小,并且不应占用空间。它通常不会显示在dir或Explorer输出中。它可能占用很多块并加剧了您正在调查的磁盘使用问题。 。
– adric
2014年1月21日13:38
#4 楼
问题可能是由于群集大小引起的。根据Microsoft:
如果未对任何文件或文件夹使用NTFS压缩
卷上包含的SIZE和SIZE ON DISK
之间的差异是浪费的空间,因为簇的大小超出了必要。您
应尝试使用最佳群集大小,以使SIZE ON DISK
值尽可能接近SIZE值。
SIZE ON DISK与SIZE值之间的差异过大
表示默认群集大小对于存储在卷上的平均文件大小而言太大,并且应该减少
。只能通过备份该卷,然后通过使用format命令和/ a开关
以指定适当的分配大小来重新格式化该卷,以完成此操作:IE:
format D: /a:2048
(此示例使用2 KB的群集大小。)
尝试使用较小的群集大小格式化驱动器。
评论
话虽这么说,但不应使群集的大小小于4096字节,或仅不大于该数字的倍数。 32位OS可以处理4096字节的页面(在非PAE情况下),因此使用非多个群集可能会对文件系统性能产生负面影响。这就是为什么默认大小设置为4096字节的原因。
–俄罗斯
2014年1月20日14:17
为了补充@Ruslan所说的内容,较新的硬盘驱动器现在的扇区大小为4 kB,将文件系统与物理扇区对齐是最佳选择,并且物理扇区大小应为分配单元大小的倍数。
–鲍勃
2014年1月20日15:22
@Ruslan我相信您的意思是说它应该是4096的两倍。12288(3×4096)和20480(5×4096)并不是很好的选择。
–斯科特
2014年1月23日在22:57
#5 楼
我看到许多人建议使用较小的群集大小重新格式化驱动器。由于这是SD卡,因此请注意,许多供应商都将卡预格式化为建议的群集大小,以与NAND群集大小的大小匹配(保持同步对于获得最佳读写性能和减少磨损非常重要)。您不能更改NAND的簇大小(这是SD卡硬件的物理属性)。
首先在SD卡上运行scandisk / chkdsk以确保大小报告问题不在于损坏的文件系统内。他们应该使用更好的存储方法。修复它还应该使该应用程序在I / O和文件系统的驱动程序活动较少的情况下在许多设备上运行得更快。
评论
实际上,它不是Google Maps,而是另一个使用Google Maps的应用程序。我通知开发人员,并刚刚从我的SD中删除了这些文件。
–vfsoraki
2014年1月21日,19:33
#6 楼
这是许多文件系统的普遍问题。这里有两个因素在起作用,一个文件系统每个逻辑卷可以处理的最大“块”数和存储介质的物理限制。只能将1个文件分配给任何给定块(文件通常占用所需数量的块)。因此,具有64个字节的文本文件通常可以占用4k至32k的任何空间,具体取决于其所在的文件系统的块大小。作为一个盒子,文件系统作为一个房间。您所有的盒子都一样大小,并且您要尽可能地容纳一个房间。如果将它们全部容纳而又剩下更多的空间,则必须获得更大的盒子,以使房间完全充满盒子。将物品放入盒子的规则之一是,您可以不要把两个无关的东西放在盒子里。它们必须是同一文档的一部分。因此,如果我要键入一页文字,它将有它自己的框。如果我输入的文本有太多页面,我无法将所有内容都放在一个盒子中,那么我会简单地找到另一个盒子,然后继续将页面放在那里,直到我归档所有页面为止。我还要写下用于该文档的框和框的顺序以按顺序读取它。
根据我如何组织框,我可能只有我的清单中有足够的空间可容纳一定数量的盒子。因此,如果我有一个很大的房间可以装满,但只有很少的盒子可以使用,那么我必须使用非常大的盒子才能达到房间的容量。占用一个盒子,没有别的东西共享。
在各种存储解决方案中也有相同的情况。 FAT32仅能管理当今庞大的硬盘驱动器上被认为数量很少的“盒子”,因此它最终以非常大的“盒子”来弥补这一点。
#7 楼
除了群集大小之外,由于以下情况,您也可能会有差异:压缩或加密的文件可能会使用与逻辑文件大小不同的空间。 >链接的文件将报告n倍的链接数乘以文件的大小乘以逻辑文件的大小,但是所使用的物理空间通常较小。
评论
通常,这可能是正确的。但就我而言,高分配单元是个问题。
–vfsoraki
2014年1月21日在6:29
是的,我只是想通过给出更多可能的差异原因来增加答案。
–Archimedes Trajano
2014年1月21日,16:19
#8 楼
您应该查看Wikipedia中的“块子分配”条目。那就是你正在发生的事情。使用文件系统支持尾包包装是解决此问题的文件系统级解决方案,除了更改分配群集的大小。所有这些文件都需要重新格式化磁盘。
在某些情况下,仅将这些文件存储在存档中即可解决此问题(小文件除了在文件末尾停止丢失空间外,还将被压缩)。这会花费一些时间来进行解压缩。 。但这当然是针对程序员而非最终用户的解决方案。
http://en.wikipedia.org/wiki/Tail_packing
#9 楼
我注意到Windows 10中单个文件的文件大小差异很大,但是如果从Windows XP的同一位置(网络驱动器)查看SAME文件的属性,就不会出现较大的差异。只是很小的差异,这就是您所期望的。我认为Windows 10中存在一个错误。一个449MB的文件可能不会占用3.99GB,这就是Windows 10告诉我的。评论
仅供参考,问题与Windows 10无关。OP正在使用Windows 7。
–TheKB
16年6月15日在18:09
评论
您好thelastblack,欢迎您到SuperUser。我编辑了您的问题,以删除有关碎片整理的部分,因为两个现有的答案都集中在磁盘差异的大小/大小上,并且当每个问题都涉及到单个问题时,Stack Exchange格式效果最佳。当然,您当然可以将其作为一个单独的问题再次提出,尽管我认为到目前为止您在此问题上收到的答案表明碎片整理对您没有帮助。 (通常在固态媒体上也无济于事。)如果您觉得我有任何改变的意图,请随时进一步编辑您的问题。@MichaelKjörling嘿,我只是在关于碎片的小讨论中进行了编辑(请稍稍分散注意力)
@MichaelKjörling不要追溯性地编辑问题以适合答案。答案之一解决了OP问题的分散部分。您的编辑需要回滚以避免混淆。
@DanteTheEgregore如果您指的是Bob的答案(确实已经过编辑,还讨论了碎片的影响),那么在跳枪之前,请检查该答案和问题的编辑历史和时间戳。在我进行编辑时,Bob的回答根本没有涵盖零散的问题。如果OP想要这样做,请重新编辑“对媒体进行碎片整理可以帮助我吗?”应该解决任何悬而未决的混乱,尽管我仍然认为最好单独提出一个问题; IMO的两个值之间的差异无关紧要。
在我看来,这个应用程式的程式设计严重错误-请考虑提交错误报告。我绝不是专业的程序员,但是我曾经在JavaME中一起破解过类似的东西,当然,我必须解决的问题之一是如何将所有这些小的地图图块有效地存储(存储和访问)在容器中。我最终使用了未压缩的zip文件。