2011-05-13 50 views
8

如果我有一個包含很多零的大文件,我如何有效地使它成爲一個稀疏文件?如何讓文件稀疏?

是唯一可能讀取整個文件(包括所有零,可能patrially存儲稀疏),並重寫它到一個新的文件使用尋求跳過零區?

或者是否有可能在現有的文件中做到這一點(例如File.setSparse(long start,long end))?

我正在尋找Java或某些Linux命令的解決方案,Filesystem將是ext3或類似的。

+3

第一個解決方案是在'cp --sparse = always'中實現的,但這不是高效的,需要複製文件並隨後移動。 – rurouni 2011-05-13 08:39:41

+1

http://stackoverflow.com/questions/245251/create-file-with-given-size-in-java – joe776 2011-05-13 08:41:55

+0

@joe:這是關於從頭開始創建一個稀疏文件,但我希望使現有的文件稀疏。 – rurouni 2011-05-13 08:45:39

回答

3

Linux/UNIX上的某些文件系統可以對現有文件「打洞」。請參閱:

這不是很便攜,沒有做全線以同樣的方式;截至目前,我相信Java的IO庫不提供這個接口。

如果可以通過fcntl(F_FREESP)或通過任何其他機制獲得打孔,它應該比複製/查找循環快得多。

+0

你知不知道是否有一個工具將它應用到文件中,因爲我不是經驗豐富的C黑客。 – rurouni 2011-05-13 11:13:50

+0

高質量的答案。謝謝 – sehe 2012-01-04 22:51:41

0

根據這article,似乎目前沒有簡單的解決方案,除了使用FIEMAP ioctl。但是,我不知道如何將「非稀疏」零塊變成「稀疏」塊。

2

我認爲你最好預先分配整個文件並維護佔用的頁面/段的表/位集。

使文件稀疏會導致這些部分被分割,如果它們曾被重複使用過。也許節省幾TB的磁盤空間並不值得高度碎片化文件的性能。

0

您可以使用$ truncate -s filename filesize在Linux端子短以形成具有

只有稀疏的元數據文件。

注 - 文件大小以字節爲單位。