일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- 선그래프
- 데이터시각화
- 알고리즘 스터디
- javascript
- 알고리즘스터디
- type hint
- Join
- openCV
- String Method
- aws jupyter notebook
- Matplotlib
- pandas
- 백준
- 파이썬
- 정보처리기사 c언어
- Algorithm
- Stack
- 자료구조
- Selenium
- queue
- 코딩테스트
- MySQL
- 가상환경
- NumPy
- programmers
- 프로그래머스
- 알고리즘
- dataframe
- python
- 노마드코딩
- Today
- Total
조금씩 꾸준히 완성을 향해
[Python] 대용량 데이터 저장하고 불러오기(CSV vs Pickle) 본문
본격적으로 프로젝트를 시작하면서 생각지 못한 변수들을 마주하게 됐다.
그 중 하나가 직접 수집한 대용량의 이미지 데이터를 다루는 것이었다.
혼자 공부하면서 다루던 샘플 데이터들과는 차원이 다른 용량에 깜짝 놀랐다. 아직 1차 수집만 완료된 상태인데...
각설하고,
내가 저장하고 싶은 데이터는 (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 |