Wenn ich eine große Datei habe, die viele Nullen enthält, wie kann ich sie effizient zu einer Sparse-Datei machen?
Ist die einzige Möglichkeit, die ganze Datei zu lesen (einschließlich aller Nullen, die möglicherweise nur spärlich gespeichert werden) und sie in eine neue Datei zu schreiben, indem Sie versuchen, die Nullstellen zu überspringen?
Oder gibt es eine Möglichkeit, dies in einer vorhandenen Datei zu machen (z. B. File.setSparse (langer Anfang, langes Ende))?
Ich suche nach einer Lösung in Java oder einigen Linux-Befehlen, Dateisystem ist ext3 oder ähnlich.
Einige Dateisysteme unter Linux / UNIX können Löcher in eine bestehende Datei "stanzen". Siehe:
Es ist nicht sehr portabel und nicht auf die gleiche Weise auf der ganzen Linie; Von jetzt an glaube ich, dass die IO-Bibliotheken von Java keine Schnittstelle dafür bieten.
Wenn die Lochung entweder über fcntl(F_FREESP)
oder über einen anderen Mechanismus möglich ist, sollte sie wesentlich schneller sein als eine Kopier / Such-Schleife.
Ich denke, es wäre besser, wenn Sie die gesamte Datei vorbelegen und eine Tabelle / BitSet der Seiten / Abschnitte verwalten, die belegt sind.
Wenn Sie eine Datei spärlich erstellen, werden diese Abschnitte fragmentiert, wenn sie erneut verwendet werden. Vielleicht ist das Speichern von ein paar TB Speicherplatz auf der Festplatte den Leistungshit einer stark fragmentierten Datei nicht wert.
Sie können $ truncate -s filename filesize
auf linux teminal verwenden, um Sparse-Dateien mit
nur Metadaten.
HINWEIS --Filesize ist in Bytes.
Tags und Links java linux file sparse-file