2013-08-14 2 views
0

20k + 라인이있는 .csv 파일을 읽으려고하고 있으며 각 라인에는 ~ 300 개의 필드가 있습니다.C++의 빠른 CSV 파서

줄 단위로 읽으려면 자체 코드를 사용하고 필드는 줄을 구분하고 해당하는 데이터 형식 (정수, 이중 등)으로 필드를 변환합니다. 그런 다음이 데이터는 생성자를 통해 클래스 객체로 전송됩니다.

그러나 매우 효율적이지는 않습니다. 이 20k + 라인을 읽고 20k + 오브젝트를 생성하는 데 약 1 분이 걸렸습니다.

저는 빠른 csv 파서에 대해 봤는데 많은 옵션이 있다는 것을 알았습니다. 나는 그 중 일부를 시도했지만, 시간 수행에별로 만족하지는 못했다.

누구나 대형 .csv 파일을 더 잘 읽을 수있는 방법이 있습니까? 미리 감사드립니다.

+0

코드를 게시하면 최적화를 찾을 수 있습니다. – mark

+0

요구 사항은 무엇입니까? "CSV"는 다소 모호합니다. 한때 내 파서와 같은 문제가있었습니다. 그것은 따옴표로 묶인 문자열, 이스케이프 된 따옴표 및 개행 문자 셀을 처리했으며 Excel의 CSV 이해와 호환되었습니다. 또 다른 성능 히트는 VS 2008의 변환에 대해 표준 C++'stringstream'을 사용하는 것이 었습니다.이 변환은 꽤 느리고 글로벌 잠금을 도입했습니다. http://stackoverflow.com/questions/1120140/csv-parser-in-c에서 제안서를 살펴 보았습니까? – mkluwe

+0

예를 들어, 20k + 객체의 생성과 같은 모든 시간을 소비하는 _parsing_이라는 것을 어떻게 알 수 있습니까? – dhavenith

답변

0

구문 분석을하거나 파일을 처리하는 효율적인 방법은 구문 분석을 시작하기 전에 많은 파일을 메모리로 읽는 것입니다.

파일 I/O는 컴퓨터의 새벽부터 컴퓨터 시스템의 느린 부분 중 하나였습니다. 예를 들어 데이터 구문 분석에는 1 마이크로 초가 걸릴 수 있습니다. 하드 드라이브에서 데이터 읽기는 1 밀리 초 == 1000 마이크로 초가 걸릴 수 있습니다.

데이터 용으로 큰 배열을 할당하고 배열에 데이터를 읽음으로써 프로그램을 더 빠르게 만들었습니다. 다음으로 배열의 데이터를 처리하고 전체 파일이 처리 될 때까지 반복합니다.

또 다른 기술은 OS가 파일을 필요에 따라 메모리로 읽는 것을 처리하는 메모리 매핑이라고합니다.

병목 현상이있는 코드를 표시하려면 게시물을 편집하십시오.