pd.read_csv(file)을 했는데, 완료하지 못하고 중간에 kernel이 죽는 현상을 해결하는 방법에 대해 포스트 해보려고 합니다.
pandas는 기본적으로 용량이 큰 파일을 읽는 데에 최적화 되어 있지 않다고 합니다.
pd.read_csv를 하다가 kernel이 죽는 것은 메모리가 모자라서입니다.
pandas에 chunksize(int)를 설정함으로 이 문제를 해결할 수 있었습니다.
pd.read_csv에 있는 옵션 설정으로, chunksize에 해당하는 row씩 끊어서 읽어옵니다.
별도의 반복 지정문 없이도, 읽어왔던 부분 바로 다음부터 다시 데이터를 읽어오게 됩니다.
sklearn에서 제공하는 연습용 data set 중 하나인 iris data set을 불러와서 연습을 해보겠습니다.
1. dataset을 불러와서 csv 파일로 저장해 줍니다.
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns = iris.feature_names)
df.to_csv('./iris.csv')
2. 이 파일을 chunksize를 이용해서 불러와 보도록 하겠습니다.
chunk = pd.read_csv('./iris.csv', chunksize = 10)
chunk = list(chunk)
이 상태에서 chunk는 iris.csv 데이터의 10개 row씩 가지고 있는 data frame의 묶음이 됩니다.
각각의 data frame을 확인해보고 싶으시면, 아래와 같이 확인할 수 있습니다.
chunksize를 10으로 설정했기 때문에, 각 df의 첫번째는 0, 10, 20, ... 과 같이 인덱스를 가지게 됩니다.
for df in chunk :
display(df.head(3))
3. 일반적인 pd.read_csv 와 같은 결과를 얻기 위해선 concat을 사용해주면 됩니다.
df = pd.concat(chunk)
df
2에서 list(chunk)를 사용하지 않으면, for 문을 돈 후에, chunk 가 empty가 되어서, concat을 해도 empty dataframe을 보여줍니다.
이유는, chunk 가 generator라 구조를 가지고 있기 때문이라고 합니다.
그리고, chunksize는 크기를 너무 작게 설정하면 안되는데, 데이터 파일 크기 마다 아래 표를 참고하시면 될 것 같습니다.
Reference:
'머신러닝 > 오류 모음집' 카테고리의 다른 글
[Mac OS] terminal에서 Jupyter 실행 시 오류 (0) | 2021.04.22 |
---|---|
Adam Optimizer (0) | 2021.03.01 |
Word cloud 원하는 색으로 꾸미기 (word cloud customize color) (0) | 2021.02.21 |
Mac에서 Matplotlib 사용 시, 한글 깨짐 해결 (0) | 2021.02.18 |
Mac에서 conda 실행하기 (0) | 2021.02.07 |