Za 8 let se toho hodně změnilo.
Falokace
fallocate -d
filename
lze použít k děrování otvorů ve stávajících souborech. Z fallocate(1)
manuálová stránka:
-d, --dig-holes
Detect and dig holes. This makes the file sparse in-place,
without using extra disk space. The minimum size of the hole
depends on filesystem I/O block size (usually 4096 bytes).
Also, when using this option, --keep-size is implied. If no
range is specified by --offset and --length, then the entire
file is analyzed for holes.
You can think of this option as doing a "cp --sparse" and then
renaming the destination file to the original, without the
need for extra disk space.
See --punch-hole for a list of supported filesystems.
(Ten seznam:)
Supported for XFS (since Linux 2.6.38), ext4 (since Linux
3.0), Btrfs (since Linux 3.7) and tmpfs (since Linux 3.5).
tmpfs být na tomto seznamu je ten, který považuji za nejzajímavější. Samotný souborový systém je dostatečně efektivní na to, aby spotřeboval pouze tolik paměti RAM, kolik potřebuje k uložení svého obsahu, ale vytváří obsah sparse může potenciálně tuto efektivitu ještě dále zvýšit.
GNU cp
Navíc někde na cestě GNU cp
porozuměli řídkým souborům. Citace cp(1)
manuálová stránka týkající se jeho výchozího režimu --sparse=auto
:
řídké SOURCE soubory jsou detekovány hrubou heuristikou a odpovídající soubor DEST je také řídký.
Ale je tu také --sparse=always
, který aktivuje ekvivalentní kopírování souborů fallocate -d
dělá na místě:
Zadejte
--sparse=always
k vytvoření řídkého souboru DEST vždy, když soubor SOURCE obsahuje dostatečně dlouhou sekvenci nula bajtů.
Konečně jsem mohl vyřadit svůj tar cpSf - SOURCE | (cd DESTDIR && tar xpSf -)
one-liner, což byl po 20 let můj šedovousý způsob kopírování řídkých souborů se zachováním jejich řídkosti.
Některé souborové systémy na Linuxu / UNIXu mají schopnost "prorazit díry" do existujícího souboru. Viz:
- Příspěvek LKML o této funkci
- Nejčastější dotazy ke zkrácení souborů UNIX (hledejte F_FREESP)
Není to příliš přenosné a nedělá se to stejným způsobem napříč; v tuto chvíli se domnívám, že IO knihovny Java pro to neposkytují rozhraní.
Pokud je k dispozici děrování, buď pomocí fcntl(F_FREESP)
nebo prostřednictvím jakéhokoli jiného mechanismu by to mělo být výrazně rychlejší než smyčka kopírování/hledání.
Myslím, že by bylo lepší předem alokovat celý soubor a udržovat tabulku/BitSet stránek/sekcí, které jsou obsazené.
Pokud by byl soubor řídký, vedlo by to k fragmentaci těchto sekcí, pokud by byly někdy znovu použity. Možná úspora několika TB místa na disku nestojí za výkon vysoce fragmentovaného souboru.