구글드라이브로 대용량 데이터를 다룰 때 필요한 테크닉(압축해제, 자동압축, 파일 크기 확인방법)
구글 드라이브의 한 폴더 내에 너무 많은 데이터가 있을 경우,
colab에서 구글 드라이브로 연동할때, 파이썬이 구글 드라이브의 폴더 내의 데이터에 제대로 접근하지 못한다
그래서 한 폴더당 10000개 이내로 데이터를 분할해서 저장해두는게 유리하다
---------------------------------------------------------------------------------------------------------------------
개인 드라이브에서 구글 드라이브로 데이터를 옮길때,
압축된 상태에서 옮기고 연동한 다음 파이썬으로 압축을 해제해서 사용하는게 유리할 수 있다
colab으로 구글 드라이브로 연동한 다음, 구글 드라이브의 zip파일을 압축해제하면 된다
https://code-angie.tistory.com/55
압축해제 방법은 여러 방법이 있지만 !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('../')
'프로그래밍 > Python' 카테고리의 다른 글
-1 의 50만 거듭제곱을 -1**(500000)으로 하면 안되는 이유 (0) | 2024.02.17 |
---|---|
(매우 중요)대용량 데이터로 colab 딥러닝 학습할 때 첫번째 epoch이 매우 느리다면(colab 대용량 데이터, dataloader 병목현상) (0) | 2024.01.18 |
Python 개발의 문서화 도구 Sphinx 사용해보기 (0) | 2023.12.14 |
Python으로 유튜브 영상 다운로드하는 방법 (0) | 2023.12.12 |
opencv와 PIL이 이미지를 저장하는 방식의 차이 (0) | 2023.11.07 |