典型的文件系統和POSIX接口只允許在最後調整文件大小。通常,關閉後文件在磁盤上的大小等於讀/寫位置關閉時的偏移量。關閉之前尋找也稱爲「重新定位文件結束」。什麼文件系統允許重定位文件的開頭?
包含數據隊列的文件將通過刪除文件開頭的操作更有效地表示。開始時的磁盤分配塊可以被釋放,並且不必要的拷貝被最小化。
這是否直接受到任何常見文件系統格式和/或操作系統的支持?什麼樣的界面被用來做到這一點? (例如,一個Linux fcntl
選擇器。)我很確定我在實踐中聽說過這種事情。
典型的文件系統和POSIX接口只允許在最後調整文件大小。通常,關閉後文件在磁盤上的大小等於讀/寫位置關閉時的偏移量。關閉之前尋找也稱爲「重新定位文件結束」。什麼文件系統允許重定位文件的開頭?
包含數據隊列的文件將通過刪除文件開頭的操作更有效地表示。開始時的磁盤分配塊可以被釋放,並且不必要的拷貝被最小化。
這是否直接受到任何常見文件系統格式和/或操作系統的支持?什麼樣的界面被用來做到這一點? (例如,一個Linux fcntl
選擇器。)我很確定我在實踐中聽說過這種事情。
實際上,Linux 確實有有一個接口,可以做你正在請求的東西。這是FALLOC_FL_COLLAPSE_RANGE標誌將會崩潰。它由現代內核上的btrfs,ext4和xfs(可能還有其他)支持。儘管fallocate接口允許您指定字節偏移量和長度,但實際上COLLAPSE_RANGE調用僅在偏移量和長度是文件系統塊大小的倍數時才起作用。
欲瞭解更多信息,請參見精細手冊的fallocate(2)系統調用:http://man7.org/linux/man-pages/man2/fallocate.2.html
謝謝!舊的'FALLOC_FL_PUNCH_HOLE'標誌也解決了實際問題,儘管不會改變偏移量。我沒有嘗試過,但是聯機幫助頁表明它可靠地與字節一起工作。 – Potatoswatter
它通過將它們置零來處理字節。如果您試圖釋放空間回到文件系統,它只會在對齊的4k塊中執行此操作。 –
我見過的最接近的是文件格式,表明數據已被「刪除」,然後被刪除的空間可以重複使用。這通常只適用於DBF等固定長度的記錄格式,並且需要更多內存才能保留已重新刪除的記錄索引以及文件內記錄的順序。
如果刪除的塊可以完全清零,這與OP提出的方案一樣有效,因爲Unix FS傾向於使用稀疏表示,其中不存儲零塊。 –
@larsmans:不幸的是,將非稀疏文件轉換爲稀疏文件並不便宜,即使所討論的字節已被清零。 –
不可以,不管在Unix世界裏,無論如何。
如果您查看DBMS或Unix(ish)文件系統內部結構,它們可以在開始,結束或中間的任何位置輕鬆截斷或擴展數據集。但他們不會導出該功能;它不是Unix API傳統或POSIX標準的一部分,所以任何「開始時截斷」或「開始時擴展」的API都將是非標準(「專有」)。
這些函數的邊際效用也不清楚。誰會使用它們?多久?對於應用程序代碼來說,Unix文件(扁平的字節/字符序列)已經被證明是簡單而有效的,但是對於分層數據結構而言,它卻是一個糟糕的基礎。二十五年前,該聲明值得商榷;今天它只是一個觀察到的歷史現實。
Unix開發人員過去常常說「所有的東西都可以歸爲文件」,「我們可以通過聰明的尋求獲得隨機訪問」。然而,這些說法從未完全奏效。例如,Unix從不與小型機和大型機操作系統(例如DEC RMS,IBM ISAM和VSAM)的隨機訪問記錄管理能力相匹配。儘管那些實現文件系統,隊列,嘗試,關係數據庫和對象存儲的應用程序偶爾會將內容放入文件中,並且它們將文件用於日誌等順序操作,但它們很少依賴字符流作爲它們的低級格式。相反,他們使用B樹和散列表等結構來直接管理磁盤塊,內存段和其他底層資源。
字符流屬於表格,文檔和對象 - 適用於客戶端應用程序的抽象。如果你想要一個隊列,可以考慮使用現有的中間件(例如RabbitMQ,ZeroMQ,REDIS,某些DBMS管理器)。如果你必須自己構建它,你可能不會在簡單的字符流抽象上構建它。因此,儘管截斷/擴展在開始時對於某些事情(對數修剪而不是分段對數旋轉,例如)可能是有用的,但對於大多數數據結構實現來說,這不太可能是大贏家。
重新定位文件的開頭可能不是一個好主意。這可能會混淆具有在該文件上打開的文件描述符並期望它正確可查找的進程,即具有可預測的偏移。
如果您的主要目標只是爲了節省磁盤空間,有幾種方法。
如果您有ZFS支持並啓用重複數據刪除,則可以通過用零覆蓋之前釋放之前用於存儲文件開頭(或實際任何部分)數據的塊。
在Linux下,您還應該能夠通過使用fallocate
系統調用並將FALLOC_FL_PUNCH_HOLE標誌傳遞給支持稀疏文件(大多數)的文件系統來釋放文件存儲的部分內容。 Solaris提供了類似的fcntl
命令F_FREESP。雖然fallocate
或fcntl
將有效地工作或根本不依賴於實施。
或者,如果你運行一個操作系統,不提供fallocate
或等效的功能,但支持ZFS
(如:FreeBSD),和/或如果重複數據刪除是不是一種選擇,因爲你沒有足夠的內存來奉獻給它,一個輕量級的替代方案就是在文件系統上啓用壓縮。
關閉,選民...問一個Linux API基本上使這是一個「關於編程的問題。」如果你對不能回答感到不適,可以去其他地方消磨時間。 – Potatoswatter