
Ich arbeite mit großen Bilddatensätzen, die Millionen von Bildern enthalten, und muss die Ergebnisse jedes Verarbeitungsschritts häufig komprimieren, um sie als Backup hochzuladen.
Ich habe gesehen, dass einige Datensätze als Satz von ZIP-Dateien heruntergeladen werden können, die unabhängig voneinander als ein einheitlicher Datensatz in denselben Ordner entpackt werden können. Das kann ziemlich praktisch sein, da ich so den Prozess Herunterladen -> Dekomprimieren -> Archiv löschen in einer Pipeline ausführen kann, was sowohl in Bezug auf Zeit als auch Speicherplatz effizienter ist, wie unten mit beliebiger Zeit/Größe erklärt wird:
- Wenn Sie eine einzelne 100 GB große ZIP-Datei entpacken, dauert das Herunterladen 5 Minuten und das Entpacken 10 Minuten. Ich brauche15 Minutenum alle meine Daten zu erhalten. Angenommen, die .zip-Datei hat eine Komprimierungsrate von 50 %, dann muss ich 100+200 =300 GBFestplattenplatz.
- Beim Dekomprimieren von zwei 50 GB großen ZIP-Dateien dauert der Download jeweils 2,5 Minuten und das Dekomprimieren jeweils 5 Minuten. Ich kann Folgendes tun: 2,5 Minuten zum Herunterladen von Zip1, 5 Minuten zum Dekomprimieren von Zip1 und 2,5 Minuten zum gleichzeitigen Herunterladen von Zip2, Löschen von Zip1, dann Dekomprimieren von Zip2 in 5 Minuten, insgesamt also 2,5+5+5 =12,5 Minuten. In der Zwischenzeit muss ich nur maximal zip2, Ordner1 und Ordner2 gleichzeitig auf der Festplatte haben, also 50+100+100 =250 GBan Festplattenspeicher.
Diese Zeit- und Platzersparnis erhöht sich, wenn wir die Anzahl der einzelnen Zip-Dateien erhöhen. Ich suche daher nach einer Möglichkeit, dies zu tun.
Meine Anforderungen sind wie folgt:
- Die Methode funktioniert mit jeder Ordnerstruktur, egal wie tief sie ist.
- Durch die Komprimierung entstehen ZIP-Dateien mitgrobgleiche Größe
- Alle resultierenden Archive können unabhängig voneinander dekomprimiert werden, um einen Teil des Ordners wiederherzustellen (manchmal möchte ich für Tests nur einen Teil des Datensatzes verwenden und in diesem Fall möchte ich nicht den gesamten Datensatz dekomprimieren müssen).
- Optional:
- Die Methode sollte in der Lage sein, einen Fortschrittsbalken anzuzeigen
- Die Methode ist schnell und effizient
Ich denke, ich könnte ein Bash- oder Python-Skript schreiben, das die ersten paar Anforderungen erfüllt, aber ich bezweifle, dass es schnell genug wäre.
Ich kenne den Schalter -s in Zip und den Schalter -v in 7z, aber bei beiden ist es erforderlich, dass die Benutzer über alle Teile des Archivs verfügen, um Teile davon dekomprimieren zu können, was weitaus weniger wünschenswert ist.
Antwort1
Ich habe ein Skript, das bei dieser Aufgabe helfen kann. Unten sehen Sie ein Beispiel für ein Bash-Skript, das Dateien einzeln in separate ZIP-Archive komprimiert, sodass sie separat extrahiert werden können. Sie können dieses Skript in einem Verzeichnis ausführen, das die Dateien enthält, um ZIP-Archive zu generieren. Ich habe diesen Prozess getestet und Python, insbesondere mit Pandas, kann diese Archive problemlos lesen, ohne sie manuell zu extrahieren.
#!/bin/bash
# Set the target directory
target_directory="/path/to/your/directory"
# Navigate to the target directory
cd "$target_directory" || exit
# Iterate through files in the directory
for file in *.csv; do
if [ -f "$file" ]; then
# Build the target ZIP file name
zip_file="${file}.zip"
# Check if the target ZIP file already exists, if yes, skip compression
if [ -f "$zip_file" ]; then
echo "File $zip_file already exists. Skipping compression."
else
# Compress the file
zip "$zip_file" "$file"
if [ $? -eq 0 ]; then
echo "File $file compressed successfully into $zip_file."
# Remove the original CSV file after successful compression
rm "$file"
else
echo "File $file compression failed."
fi
fi
fi
done
Wenn Sie dieses Skript im Verzeichnis ausführen, werden für jede CSV-Datei separate ZIP-Dateien erstellt und die ursprüngliche CSV-Datei nach erfolgreicher Komprimierung gelöscht.
Antwort2
DerZIP-Dateiformatist eigentlich nur ein Container (im Grunde ein Ordner), der komprimierte Dateien enthält. Dies steht im Gegensatz zum .tar.gz-Format, das häufig auf Linux-Plattformen verwendet wird. Der Vorteil von ZIP besteht darin, dass der Inhalt individuell extrahiert werden kann, genau wie Sie es wünschen, ohne das gesamte Archiv zu extrahieren.
Tatsächlich unterstützen die meisten Betriebssysteme, einschließlich Windows, das Öffnen eines ZIP-Ordners, um Dateinamen und Metadaten zu überprüfen, ohne das gesamte Archiv zu extrahieren. Und es ist nicht schwierig, nur eine Teilmenge einer großen Verzeichnisstruktur zu extrahieren (unter Windows kopieren und fügen Sie einfach eine Auswahl von Dateien ein).
7-Zipkann dies ebenfalls, allerdings müssen Sie dazu die Schaltfläche „Kopieren“ drücken und anschließend das Ziel angeben.
Es gibt Probleme mit verschachtelten ZIP-Dateien. Im Allgemeinen muss die übergeordnete ZIP-Datei vollständig extrahiert werden, um die untergeordneten Dateien überprüfen zu können.
Nebenbei bemerkt: Das erwähnte .tar.gz-Format verwendet denselben DEFLATE-Algorithmus wie ZIP, kann aber manchmal besser komprimieren, da auch die Dateinamen und Metadaten komprimiert werden. Der Nachteil dabei ist, dass normalerweise das gesamte Archiv extrahiert werden muss, um den Inhalt zu überprüfen.