Как сжать одну папку в несколько .zip-файлов, каждый из которых можно будет извлечь независимо?

Как сжать одну папку в несколько .zip-файлов, каждый из которых можно будет извлечь независимо?

Я работаю с большими наборами данных изображений, содержащими миллионы изображений, и мне часто приходится сжимать результаты каждого этапа обработки, чтобы загрузить их в качестве резервной копии.

Я видел, что некоторые наборы данных можно загрузить как набор .zip-файлов, которые можно распаковать независимо в ту же папку как один последовательный набор данных. Это может быть довольно удобно, поскольку позволяет мне конвейеризировать процесс загрузки -> распаковки -> удаления архива, что более эффективно с точки зрения как времени, так и пространства для хранения, как поясняется ниже с произвольным временем/размерами:

  • При распаковке одного 100 ГБ .zip, скажем, загрузка занимает 5 минут, а распаковка — 10 минут. Мне нужно15 минутчтобы получить все мои данные. Предполагая, что .zip имеет степень сжатия 50%, мне нужно использовать 100+200 =300ГБдисковое пространство.
  • При распаковке двух 50 ГБ .zip, предположим, что загрузка каждого занимает 2,5 минуты, а распаковка каждого занимает 5 минут. Я могу сделать: 2,5 минуты на загрузку zip1, 5 минут на распаковку zip1 и 2,5 минуты на загрузку zip2 одновременно, удалить zip1, затем распаковать zip2 за 5 минут, итого 2,5+5+5 =12,5 минут. Между тем, мне нужно иметь на диске максимум zip2, folder1 и folder2 одновременно, поэтому 50+100+100 =250ГБдискового пространства.

Эта экономия времени и места увеличивается по мере увеличения количества отдельных zip-файлов. Поэтому я ищу способ сделать это.

Мои требования таковы:

  • Метод может работать с любой структурой папок, независимо от ее глубины.
  • Результатом сжатия являются файлы .zipгрубоодинаковый размер
  • Все полученные архивы можно распаковать независимо друг от друга, чтобы восстановить часть папки (иногда мне может понадобиться использовать только часть набора данных для тестов, и в этом случае мне не хочется распаковывать весь набор данных).
  • Необязательный:
    • Метод должен иметь возможность отображать индикатор выполнения.
    • Метод быстрый и эффективный.

Думаю, я смогу написать скрипт на bash или python, который будет соответствовать первым нескольким требованиям, но сомневаюсь, что он будет достаточно быстрым.

Я знаю о ключе -s в zip и ключе -v в 7z, но они оба требуют, чтобы у пользователей были все части архива, чтобы иметь возможность распаковать любую его часть, что гораздо менее желательно.

решение1

У меня есть скрипт, который может помочь в этой задаче. Ниже приведен пример скрипта Bash, который индивидуально сжимает файлы в отдельные архивы ZIP, делая их отдельно извлекаемыми. Вы можете выполнить этот скрипт в каталоге, содержащем файлы, чтобы сгенерировать архивы ZIP. Я протестировал этот процесс, и Python, особенно с Pandas, может легко читать эти архивы без ручного извлечения.

#!/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

Запуск этого скрипта в каталоге создаст отдельные ZIP-файлы для каждого CSV-файла и удалит исходный CSV-файл после успешного сжатия.

решение2

TheФормат файла ZIPна самом деле это просто контейнер (по сути папка), содержащий сжатые файлы. Это контрастирует с форматом .tar.gz, который часто используется на платформах Linux. Преимущество ZIP в том, что содержимое можно извлекать индивидуально, как вы и надеетесь, не извлекая весь архив.

Действительно, большинство операционных систем, включая Windows, изначально поддерживают открытие ZIP-папки для просмотра имен файлов и метаданных без извлечения всего архива. И несложно извлечь только подмножество большой структуры каталогов (в Windows вы просто копируете-вставляете выбранные файлы)
7-Зипэто тоже возможно, но для этого нужно нажать кнопку «Копировать», а затем указать место назначения.

Возникают проблемы с вложенными .zip-файлами. Обычно для просмотра дочерних файлов родительский .zip-файл приходится полностью извлекать.

В качестве отступления, упомянутый мной формат .tar.gz использует тот же алгоритм DEFLATE, что и ZIP, но иногда он может сжимать лучше, поскольку имена файлов и метаданные также сжимаются. Стоимостью этого является то, что обычно для просмотра любого его содержимого необходимо извлечь весь архив.

Связанный контент