題 為什麼“大小”和“磁盤大小”之間存在如此大的差異?


正如你在下面看到的那樣,它之間存在很大差異 尺寸 和 磁盤大小 我文件夾中的字段。這是為什麼?

Screenshot showing 50,875 files in 1,504 folders, 105 MB being 1.43 GB on disk

我知道 磁盤大小 應該多一點 尺寸 因為在Windows中配置單位,但為什麼那麼大的區別呢?可能是因為文件數量很大?

順便說一句,這個文件夾在我的Android手機的SD卡上。在此內部,我的地圖應用程序存儲其緩存的地圖,應用程序從Google地圖獲取其地圖。


297
2018-01-20 09:48


起源


你好thelastblack,歡迎來到SuperUser。我編輯了您的問題以刪除有關碎片整理的部分,因為現有的兩個答案都集中在磁盤差異的大小/大小上,並且當發布的每個問題都是一件事時,Stack Exchange格式效果最好。你當然可以重新問一下,作為一個單獨的問題,儘管我認為到目前為止你在這個問題上得到的答案表明碎片整理對你沒有幫助。 (它對固態媒體也一般沒有好處。)隨意 編輯 如果您覺得我以任何方式改變了您的意圖,那麼您的問題會進一 - α CVn
@MichaelKjörlingHhh,我剛剛在一篇關於碎片的小討論中進行了編輯(稍早分散了注意力) - Bob
@MichaelKjörling 別 追溯編輯問題以適合答案。其中一個答案解決了OP問題的碎片部分。您的編輯需要回滾以避免混淆。 - DanteTheEgregore
@DanteTheEgregore如果您指的是鮑勃的答案,其確實已被編輯以討論碎片的影響,那麼在跳槍之前,請檢查該答案和問題的編輯歷史和時間戳。在編輯時,Bob的回答根本沒有涉及碎片問題。如果OP想要這樣做,那麼在“對介質進行碎片整理會對我進行碎片整理有幫助嗎?”應該解決任何懸而未決的困惑,儘管我仍然覺得 這是一個單獨的問題; IMO這兩個值之間的區別是無關緊要的。 - α CVn
在我看來,這個應用程序編程嚴重錯誤 - 考慮提交錯誤報告。我不是一個專業的程序員,但我曾經在JavaME中一起攻擊類似的東西,當然我必須解決的一個問題是如何在容器中有效地存儲所有這些小地圖圖塊(存儲和訪問)。我最終使用了未壓縮的zip文件。 - A. Donda


答案:


我將假設你在這裡使用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。你的文件只使用了少量的這個空間,其餘的基本上都是浪費,但仍然屬於文件 - 很像你沒有人居住的臥室。

為什麼有不同的分配單位大小?好吧,它變成了一個更大的桌子之間的權衡(地址簿,例如說John在123 Fake Street擁有一所房子,124 Fake Street,666 Satan Lane等),或者在每個單元(房屋)中浪費更多的空間。如果你有更大的文件,那麼使用更大的分配單元會更有意義 - 因為文件在獲得所有其他單元之前不會獲得新單元(house)。如果你有很多小文件,那麼,無論如何你都會有一張大桌子(地址簿),所以也可以給他們小單位(房子)。

如果您有大量小文件,大型分配單元通常會浪費大量空間。對於一般用途,通常沒有理由超過4 kB。


不成?

至於碎片化,碎片不應該以這種方式浪費空間。大文件可能被分段,即分成多個分配單元,但每個單元應在下一個單元啟動之前填充。碎片整理可能會在分配表中節省一點空間,但這不是您的具體問題。


可能的解決方案

gladiator2345建議,此時您唯一的實際選擇是使用它或使用較小的分配單元重新格式化。

您的卡可能格式化為FAT16,其對錶大小的限制較小,因此需要更大的分配單元才能滿足更大的捲(上限為2 GB,32 kB分配單元)。 資源 禮貌 Braiam。如果是這種情況,您應該能夠安全地格式化為FAT32。


300
2018-01-20 09:54



由於最小分配大小而浪費的空間實際上在技術上被稱為“內部碎片”,所以你 可以 說碎片是罪魁禍首。但它仍然不是任何“碎片整理”工具可以做任何事情的東西。 - hobbs
(從技術上講,它只是被稱為“鬆弛”。) - hobbs
群集大小也限制了最大文件系統大小。例如,如果您的地址空間是32位,那麼總共有大約42.9億個集群。現在,如果使用NTFS支持的最小簇大小(512字節),則最多可以尋址512 * 2 ^ 32字節= 2 GiB。如果需要可存儲2 GiB以上數據的捲,則必須增加群集大小。這完全獨立於您嘗試存儲的實際最大文件,授予您無法存儲大於2 GiB的文件,這是您遇到的最少問題。 - Andon M. Coleman
4 KiB集群將允許您處理最大16 TiB的捲中的文件,這在可預見的未來應該足夠了。 - Andon M. Coleman
好吧,他可以將他的小文件存檔壓縮成一個大文件。 - einpoklum


這是將壓縮/歸檔到單個文件中可能有所幫助的情況之一。什麼 鮑勃在他的回答中說道 但正如其他答案所暗示的那樣,解決方案可能比重新格式化磁盤更容易。如果壓縮或歸檔目錄(使用zip,tar或任何其他方法),文件系統將看到您有一個大文件,而不是幾個較小的文件。即使沒有壓縮,你也會回來幾乎1.4 GiB的空間,因為所有這些“小文件”將被算作一個大文件。

在此內部,我的地圖應用程序存儲其緩存的地圖,應用程序從Google地圖獲取其地圖

也許您應該與開發人員討論使用存檔或數據庫而不是多個文件。這可能也有助於減少磁盤碎片,並確保節省空間,特別是如果它是一個NAND閃存驅動器。如果您解釋100MB有效載荷/有用數據變為1.4GiB的荒謬情況,那麼數據的存儲方式就會出現問題,開發人員應該提供更好的解決方案。


46
2018-01-20 15:03



>在此內部,我的地圖應用程序存儲其緩存的地圖,應用程序從Google地圖獲取其地圖。  - 不幸的是,在這種情況下,壓縮(實際上是基礎文件系統之上的文件系統)需要來自此映射應用程序的支持。 - Bob
@Bob那麼解決方案應該來自開發者方面D: - Braiam
那是完全正確的。我想暫時,我應該改變我的應用程序。 - vfsoraki
@Braiam它並沒有欺騙文件系統認為只有一個文件;那裡 是 只有一個文件。至於為什麼開發人員不將緩存信息存儲在存檔中,可能是因為大多數存檔格式不是為快速隨機寫入而設計的,而緩存當然需要這些寫入。更好的選擇可能是使用像SQLite這樣的輕量級數據庫庫。 - bcrist
絕對正確..... +1 - arundevma


如果有人遇到這個問題,那麼知道在磁盤上看到文件大小/空間差別很大的另一個原因是使用 備用數據流 (ADS)

據我所知,這僅適用於NTFS。 ADS以合法和非合法用途著稱:

  • 標記從Internet下載的文件
  • 存儲元數據(微軟希望包含一些Apple OS功能,比如不使用文件擴展名來確定文件的類型)
  • 隱藏惡意軟件上下文中的數據或代碼

ADS簡單:任何NTFS文件都可以容納多個數據流(了解“子文件”)。一個是Windows資源管理器和其他Windows工具使用的主流,它保存文件的常用內容。備用數據流可能包含其他信息,與主流完全相同,但Windows工具無法直接處理它們(特別是Explorer顯示的文件大小等於主流的大小,無論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“secret”中添加了字節,但Explorer中的文件大小並未發生變化。

嘗試顯示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中隱藏完整的可執行文件,並隨時運行它。財富對黑客沒有害處:-)


25
2018-01-21 07:37



我自己不是一個勝利者,我的工作主要是在Linux上完成的。這非常有用。謝謝 - vfsoraki
使用諸如Streams之類的工具是值得的 Sysinternals的 檢查ADS使用情況。例如,在Windows系統上下載的文件可能會被ADS中的源標記,儘管這很小並且不佔用空間。它通常不會在dir或Explorer輸出中顯示。它可能會佔用塊並加劇您正在調查的磁盤使用問題。 。 - adric


問題可能是因為群集大小。

根據 微軟

如果您沒有對任何文件或文件夾使用NTFS壓縮   包含在音量上,SIZE和SIZE ON DISK之間的差異   是因為大於必要的簇大小而浪費了空間。您   應嘗試使用最佳簇大小,以便SIZE ON DISK   value盡可能接近SIZE值。太過分了   SIZE ON DISK和SIZE值之間的差異是   指示默認群集大小對於平均值而言太大   您存儲在卷上的文件大小,它應該是   降低。這只能通過備份音量來完成   使用format命令和/ a開關重新格式化卷   指定適當的分配大小:IE: format D: /a:2048   (此示例使用2 KB的簇大小)。

嘗試使用較小的簇大小格式化驅動器。


19
2018-01-20 09:57



有人說,不應該使簇大小小於4096字節或不是這個數的倍數。 32位操作系統適用於(在非PAE情況下)為4096字節的頁面,因此使用非多個群集可能會對文件系統性能產生負面影響。這就是默認大小設置為4096字節的原因。 - Ruslan
為了補充@Ruslan所說的,現在新的硬盤驅動器的扇區大小為4 kB,最好將文件系統與物理扇區對齊,並將物理扇區大小的倍數作為分配單元大小。 - Bob
@Ruslan我相信你的意思是它應該是兩倍4096的力量.12288(3×4096)和20480(5×4096)不是很好的選擇。 - Scott


我看到很多人建議使用較小的簇大小重新格式化您的驅動器。由於這是一張SD卡,請注意許多供應商將卡預先格式化為建議的簇大小以匹配NAND簇大小(保持同步是 非常 對於最佳讀/寫性能和減少磨損非常重要

您無法更改NAND的群集大小(它是SD卡硬件的物理屬性)。

首先在SD卡上運行scandisk / chkdsk,以確保大小報告問題不在損壞的文件系統中。

其次,我建議你向谷歌地圖開發者報告這個錯誤,因為他們應該歸咎於此。他們應該使用優越的存儲方法。修復它還應該使應用程序在許多設備上運行得更快,因為I / O和文件系統的驅動程序活動較少。


9
2018-01-21 18:20



實際上,它不是谷歌地圖,而是另一個使用谷歌地圖的應用程序。我通知開發人員,剛剛從我的SD中刪除了這些文件。 - vfsoraki


這是許多文件系統的一般問題。這裡有兩個因素,文件系統每個邏輯卷可以處理的“塊”的最大數量以及存儲介質的物理限制。只能將1個文件分配給任何給定的塊(文件通常需要盡可能多的塊)。因此,具有64字節的文本文件通常可以從4k到32k,具體取決於它所駐留的文件系統的塊大小。

考慮這個問題的一種方法是將文件系統中的每個塊視為一個框,將文件系統視為一個空間。你所有的盒子都是相同的尺寸,你盡量在一個房間裡盡量多。如果你把它們全部放進去,剩下更多的空間,你必須得到更大的盒子,這樣房間裡就完全裝滿了盒子。

將東西放入盒子的規則之一是你不能把兩個不相關的東西放在一個盒子裡。它們必須是同一文件的一部分。因此,如果我要輸入一個文本頁面,它將擁有它自己的框。如果我的打字文本有這麼多頁面,我無法將它放在一個盒子裡,我只是找到另一個盒子並繼續將頁面放在那裡,重複直到我提交了所有頁面。我還寫下了我用於該文檔的方框以及按順序讀取它的方框。

根據我如何組織盒子,我可能只在我的清單中有足夠的空間用於一定數量的盒子。所以,如果我有一個很大的空間來填充,但只有少量的盒子,我必須使用非常大的盒子來達到房間容量。

因此,在這種情況下,我的單頁文檔仍將佔用一個盒子,沒有其他任何共享它。

各種存儲解決方案中也存在相同的情況。 FAT32只能管理當今巨大的硬盤驅動器上被認為數量較少的“盒子”,所以它最終會有非常大的“盒子”來彌補這一點。


7
2018-01-20 14:50





除了群集大小,由於以下條件,您還可能存在差異:

  • 壓縮或加密的文件可能會佔用與邏輯文件大小不同的空間。
  • 鏈接的文件將報告 ñ 將鏈接數乘以邏輯文件大小的文件大小,但使用的物理空間通常較少。

6
2018-01-20 17:42



一般來說,這可能是真的。但就我而言,高分配單位就是問題所在。 - vfsoraki
是的,我只是想通過給出更多可能的差異原因來增加答案。 - Archimedes Trajano