
저는 수백만 개의 이미지가 포함된 일부 대형 이미지 데이터 세트로 작업하며 백업으로 업로드하기 위해 각 처리 단계의 결과를 압축해야 하는 경우가 많습니다.
일부 데이터 세트는 .zip 파일 세트로 다운로드할 수 있으며, 이 파일은 일관된 하나의 데이터 세트와 동일한 폴더에 독립적으로 압축을 풀 수 있습니다. 이는 다운로드 -> 압축 풀기 -> 아카이브 삭제 프로세스를 파이프라인으로 수행할 수 있기 때문에 매우 편리할 수 있습니다. 이는 아래에서 임의의 시간/크기로 설명된 것처럼 시간과 저장 공간 측면에서 더 효율적입니다.
- 단일 100GB .zip의 압축을 풀 때 다운로드에 5분이 걸리고 압축을 푸는 데 10분이 걸린다고 가정해 보겠습니다. 나는 필요하다15 분내 모든 데이터를 얻으려면. .zip의 압축률이 50%라고 가정하면 100+200 =을 사용해야 합니다.300GB디스크 공간.
- 2개의 50GB .zip 압축을 풀 때 각각 다운로드하는 데 2.5분이 걸리고 각각의 압축을 푸는 데 5분이 걸린다고 가정해 보겠습니다. 할 수 있는 일: zip1 다운로드 2.5분, zip1 압축 풀기 5분, zip2 다운로드 2.5분을 동시에 하고, zip1을 삭제한 다음 5분 안에 zip2 압축 풀기, 총 2.5+5+5 =12.5분. 동시에 디스크에 최대 zip2, 폴더1 및 폴더2만 있으면 50+100+100 =250GB디스크 공간.
별도의 zip 파일 수를 늘리면 이러한 시간과 공간 절약 효과도 커집니다. 그래서 나는 이것을 할 수 있는 방법을 찾고 있다.
내 요구 사항은 다음과 같습니다.
- 이 방법은 폴더 구조의 깊이에 관계없이 모든 폴더 구조에서 작동할 수 있습니다.
- 압축 결과는 다음과 같은 .zip 파일입니다.대충동일한 크기
- 모든 결과 아카이브는 독립적으로 압축을 풀어 폴더의 일부를 재구성할 수 있습니다(때때로 테스트를 위해 데이터세트의 일부만 사용하고 싶을 수도 있는데, 이 경우 전체 데이터세트의 압축을 풀 필요가 없습니다).
- 선택 과목:
- 메서드는 진행률 표시줄을 표시할 수 있어야 합니다.
- 이 방법은 빠르고 효율적입니다.
처음 몇 가지 요구 사항에 맞는 bash 또는 Python 스크립트를 작성할 수 있을 것이라고 생각하지만 이것이 충분히 빠를지는 의문입니다.
나는 zip의 -s 스위치와 7z의 -v 스위치를 알고 있지만 둘 다 사용자가 아카이브의 모든 부분을 압축 해제할 수 있도록 요구하므로 이는 훨씬 덜 바람직합니다.
답변1
이 작업에 도움이 될 수 있는 스크립트가 있습니다. 다음은 파일을 개별적으로 별도의 ZIP 아카이브로 압축하여 별도로 추출 가능하게 만드는 Bash 스크립트의 예입니다. 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
디렉터리에서 이 스크립트를 실행하면 각 CSV 파일에 대해 별도의 ZIP 파일이 생성되고 압축에 성공하면 원본 CSV 파일이 삭제됩니다.
답변2
그만큼ZIP 파일 형식실제로는 압축된 파일이 포함된 컨테이너(기본적으로 폴더)입니다. 이는 Linux 플랫폼에서 자주 사용되는 .tar.gz 형식과 대조됩니다. ZIP의 장점은 전체 아카이브를 추출하지 않고도 원하는 대로 내용을 개별적으로 정확하게 추출할 수 있다는 것입니다.
실제로 Windows를 포함한 대부분의 운영 체제는 기본적으로 전체 아카이브를 추출하지 않고도 ZIP 폴더를 열어 파일 이름과 메타데이터를 검토할 수 있도록 지원합니다. 그리고 큰 디렉토리 구조의 하위 집합만 추출하는 것도 어렵지 않습니다(Windows에서는 선택한 파일을 간단히 복사하여 붙여넣습니다).
7-Zip이 작업도 가능하지만 "복사" 버튼을 누른 다음 대상을 지정해야 합니다.
중첩된 .zip 파일에 문제가 있습니다. 일반적으로 하위 항목을 검토하려면 상위 .zip 파일을 완전히 추출해야 합니다.
여담으로, 제가 언급한 .tar.gz 형식은 ZIP과 동일한 DEFLATE 알고리즘을 사용하지만 파일 이름과 메타데이터도 압축되므로 때로는 더 잘 압축할 수 있습니다. 이를 수행하는 데 드는 비용은 일반적으로 내용을 검토하기 위해 전체 아카이브를 추출해야 한다는 것입니다.