포스팅 개요
이번 포스팅은 파이썬(Python)에서 용량이 큰 csv 파일을 읽고 처리할 수 있는 방법을 정리합니다. 파이썬을 활용해서 데이터 분석 혹은 모델링 등을 하다보면 대용량의 csv 파일을 많이 다루게 되는데요. 이때 메모리 부족으로 인해(memory error) 메모리 에러가 나오는게 일상입니다. 이러한 large size csv file을 python에서 다룰 수 있는 방법이 간단하게 있는데요. 그 방법을 정리하고자 합니다.
최근에 메모리 효율 및 속도를 빠르게 다루는 방법도 정리해두었습니다.
포스팅 본문
Python을 활용해 data를 다루다보면 대용량 csv 데이터를 많이 다루게 됩니다. 보통 이런 대용량 csv를 다루기 위해서는 아래와 같은 환경에서 작업을 해야합니다.
- 더 큰 메모리를 장착할 수 있는 환경 (Scale-up)
- 분산 환경과 같은 환경 (Scale-out)
하지만, 개인 컴퓨터로 진행할 때는 이러한 환경 구축이 쉽지 않습니다. 물론 Docker 등을 활용하면 가능할 수도 있겠지만, 이번 포스팅에서는 이러한 방법이 아닌 파이썬 자체적으로 해결할 수 있는 방법을 소개하려고 합니다.
Python에서 대용량 csv를 다루는 방법
사실, 파이썬에서 대용량 csv 데이터를 다루는 방법은 굉장히 간단합니다. 아래 사진과 같이 데이터를 핸들링 하면 끝입니다!
각 코드에 대한 설명은 아래와 같습니다.
- chunksize : loop때마다 csv 데이터를 읽어올 양입니다. 10 ** 3 은 1000인데요. 이는 한 번에 1000개의 데이터를 가져온다는 뜻입니다.
- pd.read_csv(chunk_size) : python pandas에서 read_csv는 많이 이용하실겁니다. 여기서 chunksize가 있는데요. 이 옵션을 사용해서 데이터를 한 번에 몇 줄 읽어올 지 판단합니다.
- do_something(chunk) : chunk는 읽어온 데이터입니다. pandas의 read_csv에서 읽어온 형식으로 읽어오는데, chunksize만큼 데이터를 읽어옵니다. 그리고 이렇게 읽어온 데이터를 가지고 do_something에 돌려서 데이터를 처리하는 것입니다.
예제
이제 예시를 보여드리겠습니다. 먼저 아래와 같은 데이터가 저한테 있는데요. 이를 메모리에 올리면 Gb 단위로 메모리가 올라갑니다.
저는 이 데이터를 처리하는 함수 preprocess 함수를 만들었는데요. 이 함수의 역할은 단순히 index 번호를 출력해주는 함수입니다.
이제 이 데이터를 다루기 위해서, 위에서 소개해드렸던 방법대로 진행하면 됩니다.
아까랑 코드가 똑같습니다. 단순히, do_something 부분만 preprocessing으로 바뀌었을 뿐입니다.
데이터를 chunksize만큼 읽어와서 preprocess 과정을 처리하는데요. 이때 index가 어떻게 찍히는지 볼 수 있습니다.
index가 찍히는 것을 보니까, 데이터를 1000개씩 가져오다보니 index가 1000개씩 커지면서 데이터를 가져오는 것을 볼 수 있습니다.
이렇게 pandas의 chunk_size를 활용하면 큰 용량의 데이터를 핸들링하면서 처리할 수 있습니다.
개요에도 언급하였지만, Python에서 메모리 효율 및 속도를 더 빠르게 다루기 위한 글도 작성하였으니 참고하시면 도움 될 것 같습니다.
'python' 카테고리의 다른 글
Python slack API 연동하기 - slack API 설정하기 with webhooks (2) | 2020.07.30 |
---|---|
github repository로 python pip install 만드는 방법 정리 (2) | 2020.07.11 |
파이썬(Python) 라이브러리 소개 - Rich 라이브러리(텍스트 출력을 이쁘게 만들어보자) (0) | 2020.06.03 |
Python Mecab 사용자 사전 추가 에러(no such file or directory: /../dicrc) 해결하기 (0) | 2020.05.13 |
test code coverage(코드 커버리지)란? Python test code coverage 방법 (2) | 2020.02.20 |