Schnellere Alternative zu ArchiveMount?

15

Im Moment mounte ich ArchiveMountein 123.000 kB-Archiv, das mehr als 3 Millionen Dateien enthält. Bisher hat es mehr als 5 Stunden montiert und ist immer noch nicht fertig.

Gibt es eine bessere Möglichkeit, eine .tar.gzDatei einzuhängen ? Ich versuche, in einen Ordner zu mounten, und unkomprimiert dauert es ein paar Gigs. Ich brauche nicht einmal einen Schreibmodus, nur ein Nur-Lesen ist ausreichend.

user511046
quelle
Es gibt auch AVFS ; Ich habe keine Ahnung, ob es besser läuft.
Gilles 'SO- hör auf böse zu sein'
8
Wenn Ihre Dateien als Squashfs-Modul anstatt als Tarball komprimiert würden, wäre der schreibgeschützte Zugriff sehr schnell - Sie müssen nur das Squashfs-Modul (in einer Schleife) einbinden. Benötigt das Paket squashfs-tools.
Dru8274
Ich programmiere gerade ein solches Dateisystem. Warten Sie ein paar Monate und es wird dort sein.
FUZxxl
@FUZxxl Nun, es sind 2 Jahre vergangen, haben Sie jemals dieses Dienstprogramm geschrieben?
Cybernard
@cybernard FUSE hat mich so frustriert, dass ich dieses Projekt aufgegeben habe. Ich hasse dieses undokumentierte Stück Scheiße. Ich halte das auf dem laufenden und werde es vielleicht später wieder aufnehmen.
FUZxxl

Antworten:

7

Sie können auch ein komprimiertes Squashfs-Bild erstellen

mksquashfs /etc squashfs.img -comp xz
mkdir img
mount -o squashfs,ro squashfs.img img

Dazu müssen Sie Ihr tar.gz-Archiv extrahieren.

Der Vorteil ist auch, dass das Bild eine bessere Fehlertoleranz aufweist als gz.


quelle
6

Ich habe einen schnelleren alternativen Ratarmount geschrieben , der "für mich funktioniert", weil mich dieses Problem immer wieder nervt.

Du kannst es so benutzen:

pip3 install --user ratarmount
ratarmount my-huge-tar.tar mount-folder
ls -la mount-folder # will show the contents of the tar top-level

Wenn Sie fertig sind, können Sie es wie jedes FUSE-Mount aushängen:

fusermount -u mount-folder

Warum ist es schneller als Archivierung?

Es kommt darauf an, was Sie messen.

Hier finden Sie eine Benchmark des Speicherbedarfs und der erforderlichen Zeit für die erste Bereitstellung sowie der Zugriffszeiten für einen einfachen cat <file-in-tar>Befehl und einen einfachen findBefehl.

Benchmark-Vergleich zwischen Ratarmount und Archivmount

Ordner mit jeweils 1k Dateien wurden erstellt und die Anzahl der Ordner variiert.

Das untere linke Diagramm zeigt Fehlerbalken, die die minimale und maximale gemessene Zeit cat <file>für 10 zufällig ausgewählte Dateien angeben .

Zeit für Dateisuche

Der Killervergleich ist die Zeit, die benötigt wird, um cat <file>fertig zu werden. Aus irgendeinem Grund skaliert dies linear mit der Größe der TAR-Datei (ca. Bytes pro Datei x Anzahl der Dateien) für die Archivierung, während die Zeit in ratarmount konstant ist. Dadurch sieht es so aus, als würde ArchiveMount das Suchen überhaupt nicht unterstützen.

Bei komprimierten TAR-Dateien fällt dies besonders auf. cat <file>dauert mehr als doppelt so lange wie das Mounten der gesamten .tar.bz2-Datei! Zum Beispiel benötigt die TAR mit 10k leeren (!) Dateien 2,9 Sekunden, um sie mit archivemount zu laden. Abhängig von der Datei, auf die zugegriffen wird, catdauert der Zugriff mit zwischen 3 ms und 5 Sekunden. Die dafür benötigte Zeit scheint von der Position der Datei innerhalb der TAR abzuhängen. Die Suche nach Dateien am Ende der TAR dauert länger. Dies zeigt an, dass der "Suchlauf" emuliert ist und alle Inhalte in der TAR vor dem Lesen der Datei gelesen werden.

Das Abrufen des Dateiinhalts kann mehr als doppelt so lange dauern wie das Mounten der gesamten TAR. Zumindest sollte es in der gleichen Zeit wie die Montage beendet sein. Eine Erklärung wäre, dass die Datei mehr als einmal emuliert gesucht wird, vielleicht sogar dreimal.

Anscheinend benötigt Ratarmount immer die gleiche Zeit, um eine Datei abzurufen, da sie die echte Suche unterstützt. Bei bzip2-komprimierten TARs wird sogar nach dem bzip2-Block gesucht, dessen Adressen ebenfalls in der Indexdatei gespeichert sind. Theoretisch ist der einzige Teil, der mit der Anzahl der Dateien skaliert werden sollte, die Suche im Index und der Teil, der mit O (log (n)) skaliert werden sollte, da er nach Dateipfad und Name sortiert ist.

Speicherbedarf

Wenn Sie mehr als 20.000 Dateien in der TAR haben, ist der Speicherbedarf von ratarmount im Allgemeinen geringer, da der Index beim Erstellen auf die Festplatte geschrieben wird und daher auf meinem System einen konstanten Speicherbedarf von ca. 30 MB aufweist.

Eine kleine Ausnahme ist das gzip-Decoder-Backend, das aus irgendeinem Grund mehr Speicher benötigt, wenn der gzip größer wird. Dieser Speicheraufwand ist möglicherweise der Index, der für die Suche innerhalb der TAR erforderlich ist. Weitere Untersuchungen sind jedoch erforderlich, da ich dieses Backend nicht geschrieben habe.

Im Gegensatz dazu speichert archivemount den gesamten Index, z. B. 4 GB für 2 Millionen Dateien, vollständig im Speicher, solange die TAR bereitgestellt ist.

Montagezeit

Mein Lieblingsfeature ist ratarmount, um den TAR bei jedem weiteren Versuch ohne merkliche Verzögerung zu mounten. Dies liegt daran, dass der Index, der die Dateinamen den Metadaten und der Position innerhalb der TAR zuordnet, in eine Indexdatei geschrieben wird, die neben der TAR-Datei erstellt wird.

Die benötigte Zeit für das Mounten verhält sich im Archiv etwas seltsam. Ab ca. 20.000 Dateien beginnt die Skalierung quadratisch statt linear in Bezug auf die Anzahl der Dateien. Dies bedeutet, dass ab ungefähr 4 Millionen Dateien Ratarmount viel schneller als Archivmount ist, obwohl es für kleinere TAR-Dateien bis zu 10-mal langsamer ist! Andererseits ist es für kleinere Dateien unwichtig, ob es 1s oder 0.1s dauert, um den Teer zu mounten (das erste Mal).

Die Ladezeiten für bz2-komprimierte Dateien sind zu allen Zeiten am besten vergleichbar. Dies ist sehr wahrscheinlich, weil es an die Geschwindigkeit des bz2-Decoders gebunden ist. Ratarmount ist hier etwa 2x langsamer. Ich hoffe, ratarmount in naher Zukunft zum klaren Sieger zu machen, indem ich den bz2-Decoder parallelisiere, was sogar für mein 8-jähriges System eine vierfache Beschleunigung bringen könnte.

Es ist Zeit, Metadaten abzurufen

Wenn Sie einfach alle Dateien mit findinnerhalb der TAR auflisten (find scheint auch stat für jede Datei aufzurufen !?), ist ratarmount für alle getesteten Fälle 10x langsamer als archivemount. Ich hoffe, dies in Zukunft verbessern zu können. Derzeit sieht es jedoch nach einem Designproblem aus, da Python und SQLite anstelle eines reinen C-Programms verwendet werden.

mxmlnkn
quelle
Wie würde das OP dies installieren und verwenden , um das Problem zu lösen?
Jeff Schaller
@ JeffSchaller Ich habe die Installationsanweisungen aus der github readme.md
mxmlnkn
5

Das Problem hierbei ist, dass das Format TAR (Tape ARchive) für den sequentiellen Zugriff und nicht für den wahlfreien Zugriff ausgelegt ist. Und gzip ist eine gute Ergänzung zu tar, da es ein auf Streams basierendes Komprimierungsformat ist, auch nicht für den wahlfreien Zugriff.

Ein High-Level-Tool, das nicht direkt mit den komprimierten Blöcken interagiert, muss also jedes Mal, wenn es etwas lesen muss, die gesamte Datei analysieren, um die Liste der Dateien zu erhalten. Dann wird der Cache möglicherweise ungültig und es wird erneut gelesen und dann für jede Datei, die Sie kopieren, kann es sein, dass sie erneut durchgelesen wird. Sie können ein Tool erstellen, das die Position jeder Datei und die zu dekomprimierenden Blöcke festhält, aber anscheinend haben sich nur wenige damit beschäftigt.

Wenn Sie möchten, dass dies schneller geht tar tzf file.tar.gz > filelist, öffnen Sie diese Dateiliste in vim , gedit oder was auch immer, entfernen Sie die nicht benötigten Zeilen von Dateien, speichern Sie sie und extrahieren Sie sie dann mit tar xzf file.tar.gz -T filelist -C extracted/.

Um zufälligen Zugriff auf eine komprimierte Datei zu erhalten, sollten Sie zip mit den Erweiterungen posix, rar oder, wie von dru8274 vorgeschlagen, squashfs oder sogar ZFS mit aktivierter Komprimierung oder btrfs verwenden, wenn btrfs zum Zeitpunkt des Lesens komprimiert wurde.

gefroren
quelle
3
Um zufälligen Zugriff auf eine komprimierte Datei zu erhalten, können Sie auch pixz verwenden.
Kubanczyk
0

Dies deckt nicht alle Anwendungsfälle ab, da die Verwendung auf einen Texteditor beschränkt ist. Wenn Sie sich jedoch nur für den Lesezugriff interessieren, kann dies in bestimmten Situationen hilfreich sein. vimWenn Sie auf einem Tarball ausgeführt werden, wird die Inhaltshierarchie des Archivs angezeigt (ähnlich wie beim Ausführen in einem Verzeichnis eine Dateihierarchie angezeigt wird). Durch Auswahl einer der Dateien in der Liste wird die ausgewählte Datei in einem schreibgeschützten Puffer geöffnet.

Auch dies bietet nicht unbedingt Zugriff auf Bilder oder andere Medien. Wenn Sie jedoch nur den Inhalt anzeigen oder auf textbasierte Dateien zugreifen möchten, ist dies hilfreich.

Hinweis : Dies funktioniert nicht bei allen Archivformaten.

HalosGhost
quelle
Der in vim integrierte Archiv-Viewer muss immer noch die gesamte Datei durchsuchen, um eine Auflistung zu erhalten, kaum schneller als avfs und archivemount. und solch eine riesige Auflistung von Millionen von Zeilen anzuzeigen ist auch schrecklich.
把 把 友情 留 无 盐
0

Mein Ansatz. Wenn Sie auf einem externen USB-Laufwerk oder einem externen / sekundären Festplattenlaufwerk über genügend freien Speicherplatz verfügen, sollten Sie nur Ihre .tar.gz-Datei extrahieren. Sie denken, Sie möchten wahrscheinlich keine 3 Millionen Dateien auf Ihrer Hauptsystemfestplatte haben, da dies zu einer Verlangsamung führen könnte. Ich würde empfehlen, dass die externe Festplatte in diesem Fall ein Dateisystem hat, das eine große Anzahl von Dateien problemlos verarbeitet: Denken Sie an ReiserFS, ext4 (mit der Option dir_index), XFS, vielleicht BtrFS. Es kann 1-2 Stunden dauern, bis der Extrakt fertig ist, aber Sie können in der Zwischenzeit auch einfach zum Mittagessen gehen oder über Nacht laufen lassen. Wenn Sie zurückkommen, sollte der Zugriff auf die extrahierten Dateien performant sein.

Joshua Huber
quelle
Es wird kein zusätzliches Medium benötigt, ein Loop-Gerät ist ausreichend.
把 把 友情 在 无 盐