Movatterモバイル変換


[0]ホーム

URL:


Zum Inhalt springen
WikipediaDie freie Enzyklopädie
Suche

Sparse-Datei

aus Wikipedia, der freien Enzyklopädie

EineSparse-Datei (englischsparse file;sparse für „dünnbesetzt“, „spärlich“ oder „zerstreut“) bezeichnet eineDatei, die in einemDateisystem kompakt gespeichert werden kann, da sie weniger Daten enthält als die angegebene Dateigröße – sie enthält also Abschnitte mit unbestimmtem Inhalt. In einer Sparse-Datei wechseln sich Bereiche, in denen sich bereits gespeicherte Daten befinden, mit Bereichen ab, die noch nicht beschrieben wurden. Für diese unbeschriebenen Bereiche muss im Dateisystem kein Platz belegt werden.

Grundlagen

[Bearbeiten |Quelltext bearbeiten]
Prinzip einer Sparse-Datei: Unbestimmte Bereiche der Datei brauchen nicht gespeichert zu werden, stattdessen werden nur die Informationen über deren Umfang in denMetadaten der Datei gespeichert

Es handelt sich um eine platzsparende Speicherungsform für Dateien, die (große) Bereiche mit unbestimmtem Inhalt enthalten. Diese Art der Speicherung kommt aus der Welt derinodebasiertenDateisysteme. Im Allgemeinen ist vom Dateisystem vorgegeben, dass diese unbestimmten Bereiche bei lesendem Zugriff als Folge vonNullzeichen wiedergegeben werden. Moderne Dateisystemeunixähnlicher Betriebssysteme,NTFS undAPFS unterstützen diese Möglichkeit.

Bei einer Sparse-Datei werden nur die Teile im Hintergrundspeicher abgelegt, in die auch tatsächlich Daten geschrieben worden sind. Solche Dateien können entstehen, wenn in die Datei Blöcke an verschiedene Stellen innerhalb der Datei geschrieben werden, sodass diese Blöcke nicht aneinandergrenzen. Dadurch entstehen dazwischen Bereiche innerhalb der Datei, die keinen definierten Inhalt aufweisen. So kann z. B. eine Datei mit einer nominellen Länge von 100 GiB effektiv nur einen logischen Block im Dateisystem umfassen, wenn etwa nur an einer Stelle in der Datei Daten geschrieben wurden.

Nicht alle Datei- und Betriebssysteme unterstützen Sparse-Dateien, dieam Ende einen undefinierten Bereich besitzen.

Eine solche Form der Speicherung kann sehr sinnvoll bei einigen Formen vonBinärdatenbanken sein, sowie bei der Abbildung von Partitionen in eine Datei (z. B. bei derVirtualisierung).

Hole Punching

[Bearbeiten |Quelltext bearbeiten]

War es anfangs nicht möglich, einmal belegten Platz wieder zurückzugewinnen, so gibt es ab Linux-Kernel 2.6.38 die Möglichkeit, perfallocate-Systemaufruf einLoch,englischhole, in eine Datei zustanzen,englischpunch(ing).[1] Auf unterstützten Dateisystemen werden dabei grundsätzlich ganze Datenblöcke imgestanzten Bereich auf dem Datenträger wieder freigegeben.[2] Seit Kernel-Version 3.2 werden die entsprechenden Datenblöcke zusätzlich perTRIM-Befehl auch auf dem Datenspeicher selbst freigegeben, wenn dieser das unterstützt – das ist bei vielenFlash-basierten Speichermedien, etwaSSDs, der Fall.[3]

Probleme bei der Verwendung

[Bearbeiten |Quelltext bearbeiten]

Sparse-Dateien können beim Kopieren zu Problemen führen: Beim Kopieren auf ein anderes Dateisystem, das keine Sparse-Dateien unterstützt, kann die Zieldatei nicht in kompakter Form erstellt werden. Daher werden die undefinierten Bereiche der Quelldatei bei der Zieldatei als Nullzeichen geschrieben. Dies liefert eine signifikant größere Zieldatei. Das Zieldateisystem muss über ausreichend Kapazität verfügen. Darüber hinaus müssen sowohl Kopier- bzw. Backupprogramm als auch das Betriebssystem des Ziels Sparse-Dateien unterstützen und sie als solche erkennen können.

Zu speichernde Dateien werden im Allgemeinen vom Betriebssystem nicht automatisch als Sparse-Dateien angelegt, sondern die Datei-erzeugende/-verwendende Anwendung muss gesonderte Betriebssystem-Routinen dafür verwenden – die meisten Betriebssysteme erzeugen nicht „automatisch“ Sparse-Dateien.

Auf klassischendirektadressierbaren Datenspeichern, beispielsweiseFestplatten, führen Sparse-Dateien aufgrund ihrerinhärentenFragmentierung zu Geschwindigkeitseinbußen beimlinearen Lesezugriff. AufFlash-basierte Speichermedien wieSSDs trifft dies jedoch nicht zu.

NTFS-Sparse

[Bearbeiten |Quelltext bearbeiten]

DasWindows-DateisystemNTFS verfügt im Gegensatz zu unixbasierten Dateisystemen ab Version 3 über ein speziellesDateiattribut, welches das Eingabe-/Ausgabesubsystem des Windows-Dateisystems veranlasst, für zusammenhängende Bereiche einer Datei, die lediglich aus Nullwerten besteht, keinen Speicher auf dem Datenträger zu belegen.

Sowohl normale als auch komprimierte Daten können von NTFS als Sparse-Datei behandelt werden. Unter Windows Server 2003 und Windows XP kann eine einmal als Sparse-Datei deklarierte Datei von NTFS nicht mehr in eine normale Datei umgewandelt werden. Bei späteren Windows-Versionen ist dies nur möglich, wenn keine Löcher mehr vorhanden sind.[4]

Die für unixbasierte Dateisysteme genannten Probleme bestehen im Prinzip in gleicher Weise bei NTFS, wobei allerdings das Dateiattribut dafür sorgt, dass zumindest nach den generellen Programmierrichtlinien geschriebene Programme Sparse-Dateientransparent kopieren können, ohne dass die Sparse-Eigenschaft verloren geht.

Behandlung von Sparse-Dateien unter Unix- und ähnlichen Systemen

[Bearbeiten |Quelltext bearbeiten]

Erzeugen von Sparse-Dateien

[Bearbeiten |Quelltext bearbeiten]

Sparse-Dateien lassen sich beispielsweise mit dem Unix-Kommandodd erzeugen:

dd if=/dev/zero of=sparsefile bs=1 count=1 seek=9999999

Dieses exemplarische Kommando erzeugt eine 10 Megabyte große Sparse-Datei, indem es denSchreibzeiger mittelsseek auf die Position 9999999 setzt, und dann ein Byte schreibt.

Das Erzeugen von Sparse-Dateien, die in einem „Loch“ enden, ist bei manchendd-Implementierungen nur indirekt möglich. Dazu muss zunächst eine Datei erzeugt werden, die wie im obigen Beispiel auf geschriebenen Daten endet. Danach kann der letzte Datenanteil der Datei mit Hilfe des Systemaufrufstruncate() bzw.ftruncate() entfernt werden. Dies gilt beispielsweise für Solaris. Für Linux reicht es,count=0 zu setzen, um zu verhindern, dass nach dem „Loch“ noch Daten geschrieben werden. Unter Linux wird, wenncount=0 gesetzt wurde, ohne Schreiboperation nur einftruncate() ausgeführt, was eine Sparsedatei ohne ein vom Null-Byte verschiedenes Zeichen darin anlegt.

Mit demGNU-dd lässt sich eine identische Datei auch mit dem folgenden verkürzten Aufruf erzeugen:

dd of=sparsefile bs=1 count=0 seek=10000000

Erkennen von Sparse-Dateien

[Bearbeiten |Quelltext bearbeiten]

Bei Sparse-Dateien unterscheidet sich die logische und physische Dateigröße. Während die logische Dateigröße auch die Null-Bytes umfasst, bezeichnet die physische Dateigröße den Platz, den die Datei tatsächlich im Dateisystem benötigt.

Die option-s des Unix-Kommandosls zeigt zusätzlich die physische Dateigröße an, allerdings in Blocks. Mit-k wird auch die logische Größe in Blocks angezeigt, mit-h werden beide im lesbaren Format angezeigt:

 ls -lhs sparse-file ls -lks sparse-file

Alternativ kann mit dem Unix-Kommandodu die logische Dateigröße angezeigt werden,allerdings zunächst auch in Blocks. Die Option--block-size 1 zeigt die physische Größe in Bytes an,während--bytes die logische Größe in Bytes anzeigt:

 du --block-size 1 sparse-file du --bytes sparse-file

Anwendungsbeispiel

[Bearbeiten |Quelltext bearbeiten]

Im Folgenden wird eine 10 MB große Sparse-Datei erzeugt. Beim Vergleich mit einer 3 MB großen Datei fällt erst durch einen einfachendu-Aufruf auf, dass es sich um eine Sparse-Datei handelt, welche nur 10 Blöcke auf der Festplatte benötigt.

>ddif=/dev/zeroof=sparsefilebs=1count=0seek=10M0+0Datensätzeein0+0Datensätzeaus0Bytes(0B)kopiert,2,9615e-05s,0,0kB/s>ddif=/dev/urandomof=normalfilebs=1Mcount=33+0Datensätzeein3+0Datensätzeaus3145728Bytes(3,1MB)kopiert,1,71034s,1,8MB/s>ls-lhinsgesamt3,1M-rw-r--r--1svenusers3,0M18.Mai03:08normalfile-rw-r--r--1svenusers10M18.Mai03:06sparsefile>du*3075normalfile10sparsefile

Behandlung von Sparse-Dateien unter Microsoft Windows

[Bearbeiten |Quelltext bearbeiten]

Erzeugen von Sparse-Dateien

[Bearbeiten |Quelltext bearbeiten]

Eine Datei lässt sich mit dem Windows-Kommandofsutil als Sparse-Datei kennzeichnen:

fsutil sparse setflag <Dateiname>

Dadurch werden bei zukünftigen Schreiboperationen ungeschriebene Bereiche der Datei nicht auf dem Datenträger allokiert. Um bereits vorhandene Bereiche einer als Sparse-Datei markierten Datei freizugeben, kann ebenfalls das Kommando verwendet werden:

fsutil sparse setrange <Dateiname> <Position in Byte> <Länge in Byte>

Dadurch wird der angegebene Bereich deallokiert. Zu beachten ist dabei, dass nur vollständige Blöcke, deren Länge ein Vielfaches von 64 KiB betragen und deren Startpositionen sich an Vielfachen von 64 KiB befinden, freigegeben werden können.

Um diese Operationen programmgesteuert durchzuführen, kann die Kernel-FunktionDeviceIoControl mit den KontrollcodesFSCTL_SET_SPARSE undFSCTL_SET_ZERO_DATA verwendet werden. Letzterer Code funktioniert auch bei Dateien, die keine Sparse-Dateien sind, jedoch werden die Datenbereiche nicht freigegeben, sondern mit Null-Bytes gefüllt.

Erkennen von Sparse-Dateien

[Bearbeiten |Quelltext bearbeiten]

Ob eine Datei eine Sparse-Datei ist, kann ebenfalls mit dem fsutil-Kommando ermittelt werden:

fsutil sparse queryflag <Dateiname>

Um die tatsächlich allozierten Bereiche aufzulisten, wird das Kommando wie folgt aufgerufen:

fsutil sparse queryrange <Dateiname>

Erzeugen von Sparse-Dateien mit MSSQL

[Bearbeiten |Quelltext bearbeiten]

Das Erzeugen von Sparse-Dateien durchMSSQL ab Version 2005 ist alsDatenbank-Snapshot möglich. Die folgenden SQL-Anweisungen erzeugen eine Sparse-Datei der Größe 2 Gigabyte unter dem NamenC:\UnCompressed\Dummy_Snap.mdf

 CREATE DATABASE [Dummy] ON PRIMARY (NAME=N'Dummy',FILENAME=N'C:\UnCompressed\Dummy.mdf',SIZE=2097152KB) LOG ON  (NAME=N'Dummy_log',FILENAME=N'C:\UnCompressed\Dummy_log.ldf') GO CREATE DATABASE [Dummy_Snap] ON PRIMARY (NAME=N'Dummy',FILENAME=N'C:\UnCompressed\Dummy_Snap.mdf') AS SNAPSHOT OF [Dummy]

Siehe auch

[Bearbeiten |Quelltext bearbeiten]

Literatur

[Bearbeiten |Quelltext bearbeiten]

Weblinks

[Bearbeiten |Quelltext bearbeiten]

Einzelnachweise

[Bearbeiten |Quelltext bearbeiten]
  1. FALLOCATE(2) – manipulate file space. (Manpage) In: Linux Programmer's Manual. kernel.org, 19. November 2019, abgerufen am 23. Mai 2021 (englisch): „Deallocating file space – Specifying theFALLOC_FL_PUNCH_HOLE flag (available since Linux 2.6.38) inmode deallocates space (i.e., creates a hole) in the byte range starting atoffset and continuing forlen bytes.“ 
  2. Jonathan Corbet: Punching holes in files. In: LWN.net. 17. November 2010, abgerufen am 23. Mai 2021 (englisch). 
  3. Kees Cook: discard, hole-punching, and TRIM. (Blog) In: codeblog. 15. Februar 2012, abgerufen am 23. Mai 2021 (englisch). 
  4. FSCTL_SET_SPARSE control code (Windows). Microsoft, abgerufen am 17. Januar 2013 (englisch). 
Abgerufen von „https://de.wikipedia.org/w/index.php?title=Sparse-Datei&oldid=253071100
Kategorie:

[8]ページ先頭

©2009-2026 Movatter.jp