檔案系統的配置單位
平常在使用儲存裝置時,我們可能會主要關心該裝置的最大存放大小、使用何種傳輸介面以及對應的傳輸速度等等。如果可以,我們會希望儲存裝置能夠容量足夠大,速度又快。想不到...這其實也有很大的學問。
前言
本篇提及的儲存裝置主要以硬碟為主。
最近,趁著雙11打折各平台打折的期間,正好有想要一個可移動的儲存裝置,另外存放一些應用程式。如此一來,我就能在各電腦端正常使用我慣用且熟悉的軟體,理論上會更方便。若容量也夠大,還能夠儲存其他重要資料,額外備份或是處理事情也會方便許多。
當然,傳輸速度也會是考量之一,先不談傳輸資料時的花費時間,畢竟主要目的是要用來裝應用程式,作為可攜式的應用,這個儲存裝置的運行速度也不能夠馬虎。
由於實際的運行速度也會受到系統、軟體、傳輸介面、傳輸協定、線材等等的影響,進行了一番考量之後,也為了避免太麻煩牽動其他太多的因素,我選擇了一顆PSSD(Portable Solid-state Disk,可攜式固態硬碟),其運行速度雖然並比不上現在SSD的發展,算中規中矩,但主要目的為可攜式,所以傳輸介面更通用,通常為支援Type-A、Type-C,這兩種介面都是USB(Universal Serial Bus)的一種物理介面。而且比起外接式硬碟,其大小也能夠做得更小,不需要額外買外接殼,正在使用時也不用像使用傳統硬碟一樣,怕不小心去動到。總而言之,基本上符合我的需求,也很方便。
FANXIANG 梵想 P102
- 原裝3D芯片設計,並採用3D NAND快閃記憶體 效能加倍提升
- 讀速550MB/s 寫速480MB/s
- Type-C USB3.1Gen2,免安裝驅動程式,即插即用
- 2TB/1TB/500GB/250GB(附數據線及保護皮套)
- 相容多種作業系統,方便與個人電腦,安卓或多種設備連結
- etc.
---------------------------------------------------------------------------------------------------------
以上為原商品規格說明,而下圖為實際的外觀與相對應配件:
我買的這一顆是1TB的容量,其隨附一個大小剛剛好的保護套,以及兩條原廠傳輸線,分別支援電腦插孔Type-A以及Type-C。
以下是系統讀取後的詳細內容:
可以發現其檔案系統使用的是exFAT,這其實也與其能相容於多種作業系統有關。
開始存放檔案
東西買來就是要用的,而且也想試試看使用體驗如何,於是我開始動手將需要的檔案移動到這個新硬碟上...,想不到移動完發現可使用容量少了一大部分,相當於三分之一的占用量。難不成是被動了甚麼手腳,其實總容量不大???
以下是當時的使用情況紀錄:
仔細查看了移動的資料夾的詳細內容後發現,資料夾大小40GB的佔用空間居然是自己大小的7到8倍...
這肯定跟系統的規範有關,經過了一系列的查詢之後(不得不說,Google搜尋確實好用),終於知道這一切原來是Cluster size搞的鬼,也與檔案系統密切相關。
檔案系統(File System)
檔案系統可以說是一種抽象資料型別(Abstract Data Type,ADT),為儲存和組織電腦資料的方法,簡單說它就是作業系統與儲存裝置的介面。
有它的存在,我們可以不必去親自分配哪個檔案要放在儲存裝置中的哪個區塊、儲存裝置的哪些位置還能塞東西、要如何存取儲存裝置上的資料等等的管理問題。況且其所考慮的事情遠遠不止這些,例如針對不同類型的儲存裝置,根據其不同的特性,為了最佳化,可能是寫入速度、讀取速度、硬體壽命等等的考量,也產生對應類型的檔案系統,例如: 磁碟檔案系統、快閃記憶體檔案系統、網路檔案系統等等。
各類型的檔案系統,各自也有許多分支,像是微軟(Microsoft)開發的NTFS、FAT、exFAT...、紅帽(Red Hat)開發的JFFS2、Linux(GNU/Linux)系統常用的ext系列等等。由於設計與商業上的限制,這些檔案系統對不同的作業系統以及裝置來說,也有不同的支援度,遇到的問題不是讀取不到,就是不允許寫入等等,會需要特殊的手段去解決,最典型的例子便是通常手機是不支援NTFS的,這其實也跟專利授權有關。
exFAT
而這顆PSSD預先格式化的檔案系統是exFAT(Extended File Allocation Table),以下為其在微軟(Microsoft)官方網站上的說明頁面連結:
exFAT的重點之一,正是其跨平台的性質,在微軟(Microsoft)的直接授權與支援下,加上其檔案系統的限制降低,包含突破了FAT32單一檔案最大4GB(2³²-1)的限制、目錄下可存放檔案數量提升以及能支援更大容量的儲存裝置等等。使得這個檔案系統在跨平台傳輸上,更有優勢。由於設計上的因素,在配有快閃記憶體的儲存裝置上,exFAT也更為合適,為快閃記憶體檔案系統的一種。
Allocation Unit
檔案系統的配置單位(或者說分配單元, Allocation Unit),在微軟(Microsoft)的術語中也常叫做"Cluster(叢集)",是檔案系統中的一個邏輯概念,用來映射到儲存裝置上的物理區塊,以方便管理與提升效能。
而由於我目前使用與本篇進行介紹的系統主要為Windows,所以以下皆以Cluster這個名稱為主。
那Cluster Size會如何影響我們的使用呢?
Cluster Size代表的是儲存一個文件所需的最小空間大小,也就是一個文件再怎麼地小,也會在檔案配置上,占用一個固定的空間。這個大小通常是2的冪次方。
一個越大的Cluster Size,在大檔案的傳輸以及硬碟總容量的限制上,有更大的優勢,如由於更少的讀取指令等因素,而有更快的傳輸速度,以及能接受的硬碟總容量也能更大(這是為了避免配置表過於龐大,會致使查表困難,使性能降低)。
相關的說明文件如以下連結:
查詢當前檔案系統的Cluster Size
想要得知當前所使用檔案系統的Cluster Size,最簡單有兩個方法:
- 透過格式化的選單,進行查詢。
- 直接查看一個檔案的所需空間,進行回推。
我們先從第一個方法開始講解,以下附上操作的步驟圖:
這個步驟其實要小心一點操作,不要不小心真的格式化。我們可以對著想要確認的硬碟圖示上,點擊"滑鼠右鍵"開始右鍵選單,選擇"格式化(A)..."選項,顯示的格式化視窗基本上會是當前的設定資訊。不用擔心,在按到格式化"開始"按鈕之前,不會把硬碟清空。
我們可以看到,預設這個一出廠的PSSD,其Cluster Size是256KB。這代表一個檔案,其大小只要沒有剛好是256KB的倍數,都會多占用一個最大256KB的空間。
以下兩張圖,我們可以看看支援的檔案系統,各自的配置單位大小設置範圍:
我們可以看到,其建議與能接受的配置單位大小數值根據不同的檔案系統以及儲存裝置的分割容量,而有不同的上界與下限值,且為2的冪次方。
接著,我們來寫點程式作為練習,並看看Cluster Size的作用會造成的影響。
實際體驗Cluster Size的影響
在編寫環境上,我們使用Python3,我使用的版本是3.6.8,由於只需要用到builtins,所以並無其他特別需求。而作業系統為Windows 10。
第一步設置Global Variable,用來指明欲產生的檔案位置。我們想要透過建立簡單的文字檔,來控制檔案大小,進而觀察Cluster Size與檔案大小之間的交互關係。
target_file = 'E:/TEST.txt'
雖然這個只是簡單的獨立運作程式碼,但出於習慣與練習,我們可以加上以下敘述,其作用可以在當前運行的程式為當前的py文件時,才執行此段敘述之後的程式碼,在進行單獨或單元測試時,特別好用:
if __name__ == '__main__':
# ...code for test...
由於主要功能只是要寫入檔案,我們使用open() 內建函數,並搭配'w'參數作為開啟檔案串流的模式,其作用能夠創建新檔案(若檔案不存在時),也能清空檔案重新寫入新資訊(檔案存在時)。
target_file = 'E:/TEST.txt'
if __name__ == '__main__':
data = '1' * (1)
with open(target_file, mode='w') as f:
f.write(data)
變數data儲存的是一個字串,由N個1字元組成,通常一個字元會占用1個Byte,也會有其它占用大小,這與程式語言及作業系統有關。正好這樣的性質,可以方便我們控制檔案大小。
在這裡,我們使用運算子'*',可以將'1'字串進行固定數量的次數重複,相當於str物件中的__mul__(N)方法。
我們可以觀察以下語法的效果,作為參考:
print('1'.__mul__(3 * 1))
而首先,我們是產生一個只有一個字元的文字檔,理論上檔案大小為1B。如下圖所示,檔案大小確實是1B,但占用磁碟空間卻是256KB,正好是Cluster size:
我們依序將文字檔案寫入1000個字(1000B)、(256 * 1024)個字(256KB)以及(256*1024 + 1)個字(262145B, or 256KB + 1B),各自實際所佔用磁碟空間如下圖所示:
所以為何40GB的資料夾大小,會占用314GB呢?
我們可以估算一下,40GB的資料夾大小,我們先注意此資料夾有將近120萬個檔案存在。假設每個檔案都有著256KB(當前的Cluster Size)的空間浪費,如下圖所示,以320GB為基準來做計算,平均而言差不多是120萬個檔案存在空間浪費。
至此,我們終於對這個問題解惑。
結論
本篇我們透過對檔案系統的深入探討,針對磁碟占用量與檔案大小之間的關係,得知了Cluster。我們也因此得知Cluster Size如何影響我們在電腦與儲存裝置之間的使用,比方說傳輸或運行速度、總容量空間與檔案佔用空間等等。
此外,我們也寫了一個簡單的Python寫檔程式,作為平時的練習與複習。搞清楚了來龍去脈之後,心情豁然開朗。
事實上,我們能夠根據自己的使用需求,去對檔案系統進行重新設定,只要透過先前提到的格式化。