파이썬 및 판다스는 분석가 입장에서 개발적인 지식이 많지 않아도
코드를 활용해서 분석할 수 있게끔 도와주는 훌륭한 도구이다.
대용량 데이터를 분석하다보면 결국 한정된 서버자원으로 많은 데이터를 다뤄야하는 순간이 오고,
이 때 분산처리를 활용하는 등의 방법도 있지만,
기존에 판다스로 구성된 코드라면 여러가지 방법으로 메모리 사용량을 줄일 수 있다.
여기에 대한 아이디어는 아래 영상을 많이 참고했다. (가급적 이 글보다 영상을 정독하는 것을 추천한다.)
→ https://www.youtube.com/watch?v=0Vm9Yi_ig58
위 영상에 나오는 내용 중 내가 채택한 방식은 아래 두가지이다.
- 데이터프레임에 사용할 컬럼 타입을 효율적으로 지정
- 파일 저장 포맷을 변경 (csv → parquet)
1. reduce memery usage
- 각 컬럼의 전체 값을 스캔한 후 최대, 최소값에 따라 최소한의 가능한 타입을 지정해준다. (float, int)
이렇게 했을때 약 20~70% 까지 메모리 사용량이 감소하는 것을 확인했다.
object 타입은 category 타입으로 지정해주면 메모리 사용량이 감소한다.
메모리 사용량을 측정할 때는 파이썬 패키지 중 memory_profiler를 활용했다.
(여담이지만 나중에 고생하는 것보다 최초 코드 작성 시에 코드 레벨로 메모리를 프로파일하면 좋았을 것 같다.)
- 데이터가 작은 경우 타입을 조정했을 때 오히려 메모리 사용량이 커지는 경우도 존재했는데,
무시 가능한 수준으로 보인다.
- 스캔하여 적정한 타입을 찾는 것도 시간이 걸리는 일이라,
해당 데이터에 얼마나 자주 접근해야하는지 등을 기준으로 두어 위 방법을 적용할지 선택하면 좋을 것이다.
2. pyarrow parquet 파일로 저장할 때 halffloat (float16) 타입은 저장이 불가한 오류
- 위 방식으로 최소한의 타입을 지정하다보면 float16으로 컬럼타입을 지정해주는 경우가 있다.
이 상태로 판다스의 to_parquet() 기능으로 저장하면 halffloat 타입은 지원하지 않는다는 오류가 발생한다.
이 경우의 조치 방식은 두가지이다.
1) float16 > float32 로 변경 후 저장 : 이 방식은 간단하지만 최초 메모리 사용량을 줄이고자 했던 취지에 반한다.
2) pyarrow에서 engine='fastparquet' 활용
- pyarrow로 데이터를 처리할 때 엔진을 pyarrow와 fastparquet 중 선택할 수 있다.
default는 pyarrow로 설정되어 있는데, 필요한 경우 fastparquet을 엔진으로 사용할 수 있다는 걸 알아두면 좋다.
- 참고 : Parquet에서 Unhandled type for Arrow to Parquet schema conversion: halffloat 이 발생할 때 (velog.io)
'분석 > 파이썬' 카테고리의 다른 글
VSCode에서 기존 서버에서 실행중인 Jupyter notebook 실행하기 (0) | 2023.03.30 |
---|---|
주피터노트북 분석 결과 공유를 위한 파일 포맷 변경 방법 고민 (PDF, HTML, reveal.js) (0) | 2023.03.23 |
파이썬에서 if __name__=="__main__" (0) | 2021.09.30 |