2016-11-06 3 views
2

25K 레코드가 포함 된 1.2G의 CSV 파일을 읽으려고합니다. 각각 ID와 큰 문자열로 구성됩니다. VM이 1백40기가바이트 RAM을 가지고 있기 때문에, 이상한 것 같다Pandas read_csv() 140GB RAM의 VM에서 1.2GB 파일 메모리 부족

pandas.io.common.CParserError: Error tokenizing data. C error: out of memory

및 10K 행에 메모리 사용량 만 ~ 1 %에 있습니다 :

그러나, 10K 행 주위에,이 오류가 발생합니다.

pd.read_csv('file.csv', header=None, names=['id', 'text', 'code']) 

내가 성공적으로 100 % 가까이 내 메모리를 채울 수있는 다음 더미 프로그램을 실행 :

은 내가 사용하는 명령입니다.

list = [] 
list.append("hello") 
while True: 
    list.append("hello" + list[len(list) - 1]) 
+0

'chunksize' 매개 변수를 사용하고 청크로 파일을 읽으려고 했습니까? – MaxU

+0

@MaxU 그러면 iterator를 반환 할 것이고 가능하다면 피하려고하는 코드에서 처리해야 할 것입니다 –

답변

4

이것은 chunksize의 직업처럼 들립니다. 입력 프로세스를 여러 청크로 분할하여 필요한 읽기 메모리를 줄입니다.

tp = pd.read_csv('Check1_900.csv', header=None, names=['id', 'text', 'code'], chunksize=1000) 
df = pd.concat(tp, ignore_index=True) 
+1

결과 DF에 각 청크를 연결하는 루프에서이를 수행합니다 :'df = pd.DataFrame() ; df = pd.concat ([df, x], ignore_index = True)'- 따라서 결과 DF에 __all__ 청크에 RAM이 필요하지 않습니다. – MaxU

+0

와우, 멋진 :) 고마워, 완벽하게 작동합니다. 원래 접근 방식이 실패한 이유는 무엇입니까? –

+0

@DavidFrank 원래 파일을 청크로 분할하지 않았으므로 파일을 읽는 데 너무 많은 메모리가 필요했습니다. 더 작은 덩어리를 읽는 것은 당신의 기억 제약에 대해 가능했다. – kilojoules

1

이 오류는 명시된 메모리 오류가 아닌 잘못된 csv 파일에서 발생할 수 있습니다.

사용 가능한 RAM보다 훨씬 작은 파일로이 오류가 발생했으며 닫는 큰 따옴표없이 한 줄에 여는 따옴표가있는 것으로 나타났습니다.

이 경우 데이터를 확인하거나 예를 들어 quoting=3pd.read_csv으로 전달하여 파서의 인용 동작을 변경할 수 있습니다.