일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 코딩테스트
- javascript
- String Method
- pandas
- 알고리즘스터디
- 데이터시각화
- type hint
- programmers
- Matplotlib
- 정보처리기사 c언어
- 프로그래머스
- 백준
- 알고리즘 스터디
- MySQL
- Selenium
- openCV
- 자료구조
- 노마드코딩
- aws jupyter notebook
- Stack
- Join
- 선그래프
- 가상환경
- python
- dataframe
- NumPy
- 알고리즘
- queue
- 파이썬
- Algorithm
- Today
- Total
조금씩 꾸준히 완성을 향해
[Python] 대용량 데이터 저장하고 불러오기(CSV vs Pickle) 본문
본격적으로 프로젝트를 시작하면서 생각지 못한 변수들을 마주하게 됐다.
그 중 하나가 직접 수집한 대용량의 이미지 데이터를 다루는 것이었다.
혼자 공부하면서 다루던 샘플 데이터들과는 차원이 다른 용량에 깜짝 놀랐다. 아직 1차 수집만 완료된 상태인데...
![](https://t1.daumcdn.net/keditor/emoticon/face/large/019.png)
각설하고,
내가 저장하고 싶은 데이터는 (320, 180, 3) 픽셀값을 가진 이미지들이었다.
일단 해당 폴더에서 jpg 파일을 다 가져와서 flatten을 한 후 list에 저장하였다.
평소에 흔히 하던 대로 csv 파일로 저장을 하려는데, 웬걸 커널이 계속 돌아갔다.
오랜 시간을 기다린 끝에 csv를 마주하게 되었는데, 문제는 이 파일이 전혀 읽히지가 않는단 것이었다....
메모리 에러가 자꾸 뜨길래 구글링을 해서 대책을 강구하기 시작했다.
chunksize = 10 ** 3
no_obj_list = []
for cnt, chunk in enumerate(pd.read_csv('no_obj.csv', chunksize=chunksize)):
no_obj_list.append(chunk)
일단 한 번에 1000개씩 데이터를 가져오는 코드를 시도해 보았으니 역시 불가능...
용량을 확인해 보니 무려 16.4GB였다!!!!!!
아래는 데이터 포맷에 따라 달라지는 용량, 시간 등을 보여주는 지표이다.
내가 많이 접해 본 csv나 json이 저장 효율에서는 한참 떨어지는 걸 볼 수 있다.
그래서 내가 선택한 형식은 'pickle'이다.
pickle 파일은 텍스트 상태의 데이터가 아닌 파이썬 객체 자체를 저장한다. 이 때 원하는 객체 자체를 binary로 저장하고 필요할 때 불러오기만 하면 되기 때문에 속도가 빠르다는 장점이 있다.
import pickle with open('no_obj.pickle', 'wb') as f:
pickle.dump(no_obj_imgs, f, protocol=pickle.HIGHEST_PROTOCOL)
Pickle로 저장하니 용량이 672MB로 눈에 띄게 준 것을 확인할 수 있다.
읽어오는 것도 정말 순식간에 이루어졌다.
no_obj = pd.read_pickle('no_obj.pickle')
no_obj
추가적으로 gzip을 이용하여 pickle로 저장된 데이터를 압축하고 해제할 수도 있다.
저장 용량이 더욱 줄어든다는 장점이 있다.
import pickle
import gzip
# save and compress.
with gzip.open('no_obj.pickle', 'wb') as f:
pickle.dump(no_obj_imgs, f)
# load and uncompress.
with gzip.open('no_obj.pickle','rb') as f:
data = pickle.load(f)
▶ 그 밖의 대용량 다루기 팁
- 데이터 타입 int64 -> int16 or int8 변경 (데이터 유실 가능성이 있기 때문에 데이터 형식 잘 확인하고 진행)
- DataFrame에서 iloc, loc 인덱싱 대신 iterrows() 함수 사용 => 시간 단축
- DataFrame에서 row단위로 접근할 때는 numpy로 변경 후 작업하기 => 시간 단축
'Python > 기타' 카테고리의 다른 글
깃허브(Github) 대용량 파일 업로드 (git-lfs) (0) | 2023.02.19 |
---|---|
[Python] Dictionary to Jason / json.dump() encoding 에러 & 한글깨짐 현상 (0) | 2023.01.04 |
[Google Colab Error] Your session crashed after using all available RAM (0) | 2022.11.20 |
VScode 터미널 & 환경변수 에러 / conda 터미널로 변경 (0) | 2022.09.15 |
[Python] 자주쓰는 pip 명령어 정리 (0) | 2022.09.11 |