稀疏檔案
此條目翻譯自其他語言維基百科,需要相關領域的編者協助校對翻譯。 |
稀疏檔案(英語:sparse file)是一種電腦檔案,它能嘗試在檔案內容大多為空時更有效率地使用檔案系統的空間。它的原理是以簡短的資訊(元資料)表示空資料塊,而不是在在磁碟上占用實際空間來儲存空資料塊。只有真實(非空)的資料塊會按原樣寫入磁碟。
在讀取稀疏檔案時,檔案系統會按元資料在執行時將這些透明轉換為「真實」的資料塊,即填充為零。應用程式不會察覺這個轉換。
大多數現代的檔案系統支援稀疏檔案,包括大多數Unix變種和NTFS。[1]蘋果的HFS+不提供稀疏檔案支援,但在OS X中,虛擬檔案系統層支援在任何受支援檔案系統中儲存稀疏檔案,包括HFS+。2016年6月在WWDC宣布的蘋果檔案系統(APFS[2])支援稀疏檔案。稀疏檔案常被用在磁碟映像、資料庫快照、紀錄檔檔案和科學應用中。
優勢
稀疏檔案的優勢是,它分配的儲存空間只在需要時使用:這樣節省了磁碟空間,並且可以建立很大的檔案,即使檔案系統中的可用空間不足。這也減少了首次寫入的時間,因為系統不會分配「跳過」的空間。如果初始分配需要寫入全零到空間,這也使得系統不必寫入兩次。
缺點
稀疏檔案的缺點包括:稀疏檔案可能碎片化;檔案系統的空餘空間報告可能產生誤導;包含稀疏檔案的檔案系統被填滿可能產生意外效果,例如只是重寫現有檔案的內容時遭遇磁碟已滿或超出配額錯誤——開發者未預料到檔案可能被稀疏;使用非顯式支援的電腦程式複製稀疏檔案可能會複製整個內容,即未壓縮的檔案大小,包括未實際在磁碟上分配的零空間——也就是使稀疏檔案失去稀疏屬性。稀疏檔案也不是被所有備份軟體和應用支援。不過,VFS的實現迴避了先前兩個缺點。在Windows上載入稀疏的可執行檔(exe或dll)可能需要更多時間,因為檔案不被對映到主記憶體和快取。
Unix中的稀疏檔案
稀疏檔案通常對使用者透明(不可見)處理。但在某些情況下,稀疏檔案會與正常檔案顯現出差異。
建立
Unix命令:
dd of=sparse-file bs=1k seek=5120 count=0
將建立一個5MB大小的檔案,但不在磁碟上儲存資料(僅儲存元資料)。(GNU dd也有此表現,因為它呼叫ftruncate來設定檔案大小;其他實現可能是只建立一個空檔案)。 如果truncate命令可用,也可以使用它:
truncate -s 5M <filename>
刪除
ls命令的-s選項會以塊為單位顯示已占用的空間。
ls -ls sparse-file
或者,du命令將列印占用的空間,而ls列印明面的大小。在一些非標準的du版本中,--block-size=1選項列印位元組而非塊單位的占用空間,因而可以與ls的輸出比較:
du --block-size=1 sparse-file
ls -l sparse-file
複製
一般來說,GNU版本的cp是檢測檔案是否為稀疏檔案的較好方式,所以
cp sparse-file new-file
建立一個新檔案,它將是稀疏性質。但是,GNU版本的cp有--sparse=WHEN
選項。[3]這尤為有用,如果一個已儲存檔案包含長串零塊且非稀疏方式儲存(即長串的零塊已被完全寫入並占用磁碟空間)。用此命令可以節省磁碟空間:
cp --sparse=always file1 file1_sparsed
在某些例如FreeBSD的cp實現中,--sparse
選項不被支援,將始終展開稀疏檔案。這些系統上的可行替代方案是使用rsync的--sparse
選項[4]代替cp。遺憾的是--sparse
無法與--inplace
組合使用,因此通過網路rsync巨大檔案時始終會浪費網路和磁碟頻寬。
通過標準輸入
cp --sparse=always /proc/self/fd/0 new-sparse-file < somefile
Windows的NTFS
如果一個檔案的大部分資料是0,則這個檔案被稱包含了稀疏資料集。 檔案壓縮可以有效率地表示稀疏檔案,但壓縮與解壓會帶來時間代價。 NTFS檔案系統支援稀疏檔案表示,並對檔案的讀寫操作透明。
為確定檔案系統是否支援稀疏檔案,呼叫GetVolumeInformation函式,使用lpFileSystemFlags參數,檢查返回結果對應於FILE_SUPPORTS_SPARSE_FILES位元標誌。 DWORD dwFileSystemFlags = 0; BOOL bOk = GetVolumeInformation("C:\\", NULL, 0, NULL, NULL, &dwFileSystemFlags, NULL, 0); bOk = dwFileSystemFlags&FILE_SUPPORTS_SPARSE_FILES ; 判斷一個檔案是否是稀疏檔案:GetFileInformationByHandle
大部分檔案,在改變它的EndOfFile的時候,中間的空白會被作業系統填0,也就是說,如果用SetFilePointer和SetEndOfFile來產生一個很大的檔案,那麼這個檔案它占用的是真正的磁碟空間,即使裡面全是0,系統預設的也會在DeviceIoControl()中的ControlCode里用FSCTL_SET_ZERO_DATA標記,這個標記使得那些檔案空洞被0所填充。為了節省磁碟空間,必須把一個檔案聲明為稀疏檔案,以便讓系統把那些無用的0位元組壓縮,並釋放相應的磁碟空間,這需要用DeviceIoControl()將標記改為FSCTL_SET_SPARSE。
參見
參考資料
- ^ Giampaolo, Dominic. Practical File System Design with the Be File System (PDF). Morgan Kaufmann Publishers. 1999 [2016-06-24]. ISBN 9781558604971. (原始內容 (PDF)存檔於2017-02-13).
- ^ General Characteristics. Apple Inc. [2016-06-17]. (原始內容存檔於2016-06-13).
- ^ Jim Meyering. GNU coreutils/cp: Accept new option, --sparse={never,auto,always}, to control creation of sparse files.. 1995-12-21 [2016-06-17].
- ^ Tridgell, Andrew. rsync: hard links, better sparse handling, FERROR and FINFO. 1996-06-29 [2016-06-17]. (原始內容存檔於2016-06-25).
外部連結
- NTFS Sparse Files For Programmers (頁面存檔備份,存於網際網路檔案館)
- Creating sparse files in Windows Server using fsutil (頁面存檔備份,存於網際網路檔案館)
- Creating sparse files in Solaris using mkfile(1M) (頁面存檔備份,存於網際網路檔案館)
- View the Size of the Sparse File of a Database Snapshot (頁面存檔備份,存於網際網路檔案館)
- SEEK_HOLE or FIEMAP: Detecting holes in sparse files (頁面存檔備份,存於網際網路檔案館)
- virtsync is a commercial solution to rsync's --sparse and --inplace issue.
- SparseChecker - Utility that allows to manage the sparse files on NTFS file system
- Phantom - a program to convert files to sparse files to reduce disk space (頁面存檔備份,存於網際網路檔案館)
- ArchLinux Wiki: Sparse file (頁面存檔備份,存於網際網路檔案館)