
Я работаю с большими наборами данных изображений, содержащими миллионы изображений, и мне часто приходится сжимать результаты каждого этапа обработки, чтобы загрузить их в качестве резервной копии.
Я видел, что некоторые наборы данных можно загрузить как набор .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, но иногда он может сжимать лучше, поскольку имена файлов и метаданные также сжимаются. Стоимостью этого является то, что обычно для просмотра любого его содержимого необходимо извлечь весь архив.