
Trabajo con algunos conjuntos de datos de imágenes grandes que contienen millones de imágenes y, a menudo, necesito comprimir los resultados de cada paso del procesamiento para cargarlos como copia de seguridad.
He visto que algunos conjuntos de datos se pueden descargar como un conjunto de archivos .zip, que se pueden descomprimir de forma independiente en la misma carpeta que un conjunto de datos coherente. Esto puede ser bastante conveniente ya que me permite canalizar el proceso de descarga -> descomprimir -> eliminar archivo, que es más eficiente en términos de tiempo y espacio de almacenamiento, como se explica a continuación con tiempos/tamaños arbitrarios:
- Al descomprimir un único archivo .zip de 100 GB, digamos que la descarga demora 5 minutos y la descompresión demora 10 minutos. Necesito15 minutospara obtener todos mis datos. Suponiendo que el .zip tuviera una relación de compresión del 50%, necesito usar 100+200 =300GBEspacio del disco.
- Al descomprimir dos archivos .zip de 50 GB, digamos que descargar cada uno toma 2,5 minutos y descomprimir cada uno toma 5 minutos. Puedo hacer: 2,5 minutos descargando zip1, 5 minutos descomprimiendo zip1 y 2,5 minutos descargando zip2 simultáneamente, eliminar zip1, luego descomprimir zip2 en 5 minutos, para un total de 2,5+5+5 =12,5 minutos. Mientras tanto, sólo necesito tener como máximo zip2, carpeta1 y carpeta2 en el disco al mismo tiempo, por lo que 50+100+100 =250GBde espacio en disco.
Estos ahorros de tiempo y espacio aumentan a medida que aumentamos la cantidad de archivos zip separados. Por lo tanto, estoy buscando una manera de hacer esto.
Mis requisitos son como tales:
- El método puede funcionar en cualquier estructura de carpetas, sin importar cuán profunda sea.
- La compresión da como resultado archivos .zip deapenasigual tamaño
- Todos los archivos resultantes se pueden descomprimir de forma independiente para reconstruir parte de la carpeta (a veces es posible que desee usar solo una parte del conjunto de datos para las pruebas, en cuyo caso no quiero tener que descomprimir todo el conjunto de datos).
- Opcional:
- El método debería poder mostrar una barra de progreso.
- El método es rápido y eficiente.
Creo que podría escribir un script bash o python que cumpla con los primeros requisitos, pero dudo que sea lo suficientemente rápido.
Conozco el modificador -s en zip y el modificador -v en 7z, pero ambos requieren que los usuarios tengan todas las partes del archivo para poder descomprimir cualquier parte, lo cual es mucho menos deseable.
Respuesta1
Tengo un script que puede ayudar con esta tarea. A continuación se muestra un ejemplo de un script Bash que comprime archivos individualmente en archivos ZIP distintos, haciéndolos extraíbles por separado. Puede ejecutar este script dentro de un directorio que contenga los archivos para generar archivos ZIP. Probé este proceso y Python, particularmente con Pandas, puede leer fácilmente estos archivos sin extracción manual.
#!/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
La ejecución de este script en el directorio creará archivos ZIP separados para cada archivo CSV y eliminará el archivo CSV original tras una compresión exitosa.
Respuesta2
Elformato de archivo ZIPEn realidad es solo un contenedor (básicamente una carpeta) que contiene archivos comprimidos. Esto contrasta con el formato .tar.gz que se utiliza frecuentemente en plataformas Linux. La ventaja de ZIP es que los contenidos se pueden extraer individualmente exactamente como esperas hacerlo sin extraer todo el archivo.
De hecho, la mayoría de los sistemas operativos, incluido Windows, admiten de forma nativa la apertura de una carpeta ZIP para revisar los nombres de los archivos y los metadatos sin extraer el archivo completo. Y no es difícil extraer solo un subconjunto de una estructura de directorios grande (en Windows, se copia y pega una selección de archivos)
7 cremallerasTambién puede hacer esto, pero debe presionar el botón "Copiar" y luego especificar el destino.
Hay problemas con los archivos .zip anidados; por lo general, el .zip principal deberá extraerse por completo para poder revisar los secundarios.
Como nota al margen, el formato .tar.gz que mencioné utiliza el mismo algoritmo DEFLATE que ZIP, pero a veces se puede comprimir mejor ya que los nombres de los archivos y los metadatos también están comprimidos. El costo de hacer esto es que normalmente se debe extraer todo el archivo para revisar cualquiera de sus contenidos.