구글드라이브로 대용량 데이터를 다룰 때 필요한 테크닉(압축해제, 자동압축, 파일 크기 확인방법)

구글 드라이브의 한 폴더 내에 너무 많은 데이터가 있을 경우,

 

colab에서 구글 드라이브로 연동할때, 파이썬이 구글 드라이브의 폴더 내의 데이터에 제대로 접근하지 못한다

 

그래서 한 폴더당 10000개 이내로 데이터를 분할해서 저장해두는게 유리하다

 

---------------------------------------------------------------------------------------------------------------------

 

개인 드라이브에서 구글 드라이브로 데이터를 옮길때,

 

압축된 상태에서 옮기고 연동한 다음 파이썬으로 압축을 해제해서 사용하는게 유리할 수 있다

 

colab으로 구글 드라이브로 연동한 다음, 구글 드라이브의 zip파일을 압축해제하면 된다

 

https://code-angie.tistory.com/55

 

[Python] 압축 폴더 해제하는 방법 (zip 압축 풀기)

압축 폴더를 푸는 방법에는 unzip, shutil, zipfile 3가지 방법이 있다. 3가지 방법 모두 output 폴더가 없다면 자동으로 생성해 주며, Colab에서 별도 설치 없이 실행 가능하다. 1. unzip unzip은 Linux에서 사용

code-angie.tistory.com

 

 

압축해제 방법은 여러 방법이 있지만 !unzip이 가장 빠르다고 한다

 

!unzip -qq (대상 zip파일) -d (압축을 풀 곳)

 

!unzip -qq "/content/drive/MyDrive/dacon/train3.zip" -d "/content/drive/MyDrive/dacon/"

 

 

물론 압축 풀 파일이 너무 많으면 이것도 엄청 오래걸린다

 

해보니까 5000개는 1분정도 

 

13만개는 1~2시간 이상 걸리던데

 

한 폴더에 7만개 정도 데이터가 있을때 폴더당 5000개 정도로 나눠서 저장하고 싶다면?

 

import os
import shutil
import pandas as pd

train_df = pd.read_csv('C:/Users/dbseo/Downloads/open (3)/train.csv')

img_path = train_df['img_path']

for j in range(1,15):

    os.mkdir(f'train{j}')

    for i in range(5000*(j-1),5000*(j)):

        file = img_path[i]

        target = file.replace('train',f'train{j}')

        shutil.move(file,target)

 

 

이렇게 분할저장했는데 14개 정도 폴더를 각각 압축해서 옮겨야하는데..

 

14개야 손으로 할 수 있겠지만 너무 귀찮다면?

 

먼저 shutil.move를 이용해서 각 폴더를 새로운 폴더 안으로 넣어주고

 

for i in range(1,15):

    os.mkdir(f'train2{i}')
    shutil.move(f'train{i}',f'train2{i}')

 

 

shutil.make_archive(압축파일이름, 'zip', rood_dir = (압축하고자 하는 폴더가 있는 상위 폴더))

 

이 함수를 이용하면 zip파일로 압축시켜준다

 

for i in range(1,15):

    shutil.make_archive(f'train{i}', 'zip',root_dir = f'./train2{i}')

 

 

 

 

 

 

 

 

 

 

 

이러면 각 폴더를 자동으로 압축해준다

 

사용할 때 주의할 점이라면 작업 경로를 잘 생각해야하는데.. 웬만하면 파일들이 있는 폴더 내를 작업 경로로 지정하는게 좋다

 

잘못하면 의도하지 않게 모든 파일들이 압축될 수도 있다

 

또한 rood_dir을 지정 안하면.. 현재 작업 경로내의 모든 파일을 'train.zip'으로 압축시켜버린다

 

또한 중간에 이렇게 폴더를 만들어서 다른 폴더로 옮기고.. 하는 이유는

 

for i in range(1,15):

    os.mkdir(f'train2{i}')
    shutil.move(f'train{i}',f'train2{i}')

 

 

'train7.zip' > 'train7' > '*.jpg' 형태로 압축시키고 싶어서 그렇다

 

만약 

 

train27

-- train7

---- *.jpg

 

이런 형태가 아니고

 

train7-- *.jpg 

 

이런 상태에서 압축을 시도한다면...

 

shutil.make_archive('train7', 'zip',root_dir = f'./train7')

 

 

train7.zip안에 train7 폴더가 들어가있지 않고 바로 *.jpg 이미지 파일들이 들어가있다

 

----------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

그리고 이 상태에서 이제 압축을 하나 풀고, 새로고침으로 드라이브에 잘 들어갔는지 확인하고

 

다시 반복하는걸 추천

 

for문으로 한번에 다 해버리고 확인할라하면 버그인가 안들어가지더라 

 

이렇게 하나하나 해도 한번의 런타임에 5000개 넘게 드라이브에 넣을려고하면

 

'구글 드라이브 할당량 초과'라고 뜨더라

 

그러면 그냥 런타임 삭제하고 다시 런타임 연결해서 다시 넣기를 시도하면 된다

 

-----------------------------------------------------------------------------------------------------------------------------------------

 

보니까 5000개도 많다

 

1000개로 나눠야겠다

 

이게 압축 풀더라도 구글 드라이브에 채워지는 딜레이가 조금 있네

 

딜레이가 있는 도중에 런타임 끊어버리면 더 안들어가는듯

 

그냥 500개씩 140폴더로 나눠서 구글드라이브를 데스크톱 드라이브 다운로드 받아서,

 

140폴더를 그냥 데스크톱 드라이브에 넣은 다음에 연동될때까지 기다리는게 제일 나은듯

 

---------------------------------------------------------------------------------------------------------------------------------------

 

자동으로 압축하면 극히 일부 파일이 제대로 안들어가는 경우가 있다.. 

 

os.path.getsize(path)함수는 path에 있는 파일의 크기를 알려준다

 

모든 경로들의 파일을 조사해서 파일 크기가 0인 부분을 찾는다.

 

a = []

for i in range(1,121):
    x = os.listdir(f'./test{i}')
    os.chdir(f'./test{i}')
    for j in x:
        if os.path.getsize(j) == 0:
            a.append(j)
    os.chdir('../')

 

 

TAGS.

Comments