- NTFS Sparse
-
Eine Sparse-Datei (engl. sparse file; sparse für „dünnbesetzt“, „spärlich“ oder „zerstreut“) bezeichnet eine Datei, die in einem Dateisystem sehr kompakt gespeichert werden kann, wenn sie größtenteils aus Nullbytes besteht.
Inhaltsverzeichnis
Grundlagen
Es handelt sich um eine bestimmte Speicherungsform für Dateien, die viele aufeinanderfolgende Bytes mit dem Wert 0 enthalten, d. h. lange Datensequenzen mit Nullbytes. Diese Art der Speicherung kommt aus der Welt der inodebasierten Dateisysteme und ist heute vor allem typisch für alle modernen unixartigen Betriebssysteme.
Bei einer Sparse-Datei werden nur die Teile gespeichert, die auch tatsächlich beschrieben worden sind. So kann eine Datei mit einer nominellen Länge von z. B. 100 GiB effektiv nur 512 Bytes umfassen, wenn etwa nur die letzten Bytes der Datei überhaupt Daten enthalten.
Eine solche Form der Speicherung kann sehr sinnvoll bei einigen Formen von Binärdatenbanken sein, sowie bei der Simulation von Festplatten über Dateien.
Probleme bei der Verwendung
Sparse-Dateien können problematisch werden, wenn sie kopiert werden. Ein Problemfall dabei besteht dann, wenn das Dateisystem der Zielpartition nicht die Fähigkeit besitzt, Sparse-Dateien anzulegen, und außerdem nicht genügend freier Speicherplatz existiert, um die komplette Datei inklusive der dann explizit zu speichernden Nullbytes aufzunehmen. Ein solches Problem kann etwa beim Zurückspielen von Backups auftreten.
Ein ähnlich gelagertes Problem tritt dann auf, wenn ein Kopier- oder Backupprogramm nicht in der Lage ist, die Charakteristik der Datei überhaupt zu erkennen; Sparse-Dateien werden nämlich nicht automatisch erzeugt, sondern bedürfen einer bestimmten Zugriffstechnik.
Ein weiteres Problemfeld besteht in der automatischen Fragmentierung: Sparse-Dateien werden aufgrund ihrer Anlage sozusagen inhärent fragmentiert und sind damit natürlicherweise beim Plattenzugriff nicht optimal zu erreichen. Ein lineares Einlesen einer Sparse-Datei kann daher recht zeitintensiv werden, was bei Datenbanken durchaus von Bedeutung sein kann.
NTFS Sparse
Das Windows-Dateisystem NTFS verfügt im Gegensatz zu unixbasierten Dateisystemen seit Version 3 über ein spezielles Dateiattribut, welches das Eingabe-/Ausgabesubsystem des Windowsdateisystems 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. Eine einmal als Sparse-Datei deklarierte Datei kann von NTFS nicht mehr in eine normale Datei umgewandelt werden.
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-Dateien transparent kopieren können, ohne dass die Sparse-Eigenschaft verloren geht.
Behandlung von Sparse-Dateien unter unixartigen Betriebssystemen
Erzeugen von Sparse-Dateien
Sparse-Dateien lassen sich mit dem Unix-Kommando dd erzeugen:
dd if=/dev/zero of=sparsefile bs=1 count=0 seek=10G
Dieses exemplarische Kommando erzeugt eine 10 Gibibyte große Sparse-Datei, in dem es den Schreibzeiger mittels seek auf der Position 10GiB positioniert, allerdings keine Daten schreibt. Die Eingabequelle ist damit unerheblich.
Erkennen von Sparse-Dateien
Bei Sparse-Dateien unterscheidet sich die logische und physische Dateigröße. Während die logische Dateigröße auch die Nullbytes umfasst, bezeichnet die physische Dateigröße den Platz, den die Datei tatsächlich im Dateisystem benötigt. Mit dem Unix-Kommando du lässt sich diese Differenz feststellen, in dem die Ausgaben von du -s -B1 --apparent-size sparse-file (logische Größe) und du -s -B1 sparse-file (physische Größe) verglichen werden.
Anwendungsbeispiel
Im Folgenden wird eine 10MB große Sparse-File erzeugt. Beim Vergleich mit einer 3MB großen Datei fällt erst mittels einem einfachen du-Aufruf auf, dass es sich um eine Sparse-File handelt, die nur 10 Blöcke auf der Festplatte benötigt.
> dd if=/dev/zero of=sparsefile bs=1 count=0 seek=10M 0+0 Datensätze ein 0+0 Datensätze aus 0 Bytes (0 B) kopiert, 2,9615e-05 s, 0,0 kB/s > dd if=/dev/urandom of=normalfile bs=1M count=3 3+0 Datensätze ein 3+0 Datensätze aus 3145728 Bytes (3,1 MB) kopiert, 1,71034 s, 1,8 MB/s > ls -lh insgesamt 3,1M -rw-r--r-- 1 sven users 3,0M 18. Mai 03:08 normalfile -rw-r--r-- 1 sven users 10M 18. Mai 03:06 sparsefile > du * 3075 normalfile 10 sparsefile
Behandlung von Sparse-Dateien unter Microsoft Windows
Erzeugen von Sparse-Dateien mit MsSQL
Das Erzeugen von Sparse-Dateien durch MsSQL ab Version 2005 ist als Datenbank-Snapshot möglich. Die folgenden SQL-Anweisungen erzeugen eine Sparse-Datei der Größe 2 Gigabyte unter dem Namen
C:\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
Literatur
- Dominic Giampaolo (1999). Practical File System Design with the Be File System. Morgan Kaufmann. ISBN 1-55860-497-9 (Webdokument, pdf)
Weblinks
- SEEK_HOLE or FIEMAP? – Fachartikel über das Entdecken von Löchern in Sparse-Dateien (engl.)
- NTFS Sparse Files For Programmers – Einführung in die Programmierung mit Sparse-Dateien unter Windows (engl.)
- Fsutil: sparse – Microsoft Windows Server MSDN-Center: Erläuterung von DOS-Kommandos zum Erzeugen von Sparse-Dateien unter Windows im MSDN
- Grundlegendes zur Größe von Dateien mit geringer Dichte in Datenbanksnapshots – Microsoft Developer Netzwork: Fachartikel über die Bedeutung von Sparse-Dateien bei Datenbank-Backups
- mkfile – Sun-Dokumentation: Sparse-Dateien unter Solaris erzeugen (engl.)
Wikimedia Foundation.