본문 바로가기

머신러닝/오류 모음집

pandas로 용량이 큰 csv 파일 읽어오기(kernel dies reading csv file)

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라 구조를 가지고 있기 때문이라고 합니다.

stackoverflow.com/questions/65154093/problem-with-chunksize-and-concat-valueerror-no-objects-to-concatenate

 

Problem with Chunksize and concat. ValueError: No objects to concatenate

I can't compile the following code. I know that the part of the code that it prints could be inside the loop below, but I want to understand why it does not compile the way it is written. Thank you...

stackoverflow.com

 

 

그리고, chunksize는 크기를 너무 작게 설정하면 안되는데, 데이터 파일 크기 마다 아래 표를 참고하시면 될 것 같습니다.

 

 

 

 

 

 

 

 

Reference:

acepor.github.io/2017/08/03/using-chunksize/

 

Using Chunksize in Pandas

Yet another blog about NLP, machine learning and programming

acepor.github.io

m.blog.naver.com/PostView.nhn?blogId=wideeyed&logNo=221538511790&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[Python] 큰 CSV파일 읽고 처리하는 법

데이터 분석가 입장에서 CSV(Comma Separated Values)파일은 다루기 좋은 파일형식입니다.숫자로 구...

blog.naver.com

my-repo.tistory.com/52

 

pandas 멀티프로세스 사용하기 + 큰 csv 데이터 나눠서 가져오기

프로젝트를 진행하면서 , 대량의 cvs 데이터를 읽어와 처리할 일이 생겼다. 컴퓨터 램의 용량보다 데이터가 무조건 크므로, csv_read 함수를 사용하면 램이 터져나갈 것. 이를 해결하기 위해 chunksize

my-repo.tistory.com