2015-02-04 5 views
0

대용량 CSV 파일 (~ 450MB)을 구문 분석하고 있습니다. 파서는 ifstreamgetline을 기반으로합니다. 이것은 잘 작동하지만 시간이 좀 걸립니다. 시간을 단축하기 위해 CSV 파일의 압축 버전 (~ 21MB)을 istringstream으로 읽고 동일한 파서를 사용하려고했습니다. 그러나 파서는 ifstream 또는 istringstream을 사용할 때 동일한 시간이 걸립니다. 콘텐츠가 이미 메모리에 버퍼링되어 있기 때문에 istringstream을 사용할 때 파서는 더 빨리 이해해야합니다.istringstream을 사용하여 성능 문제가 발생했습니다.

ifstream file(filename) 
istream* filePointer = &file 
if(gz file) { 
    read file into string 
    decompress string 
    create istringstream from decompressed string 
    set filePointer to istringstream 
} 
parse(filePointer) 
--- 
void parse(istream* file) { 
    // ... 
    while(getline(*file, line)) { 
     // ... 
    } 
} 

성능 결과 :

  • 압축
    • 파서 : 15 초 (ifstream)
  • 압축
      ,691 여기

      일부 의사 코드
    • 읽기 파일을 압축 해제 : 4의
    • 파서 : 15 초 (istringstream)

이 정상 동작은 istringstream가 읽고 ifstream를 사용하여 동시에 파일을 구문 분석보다 더 빨리 아니라고,인가?

+1

비 압축 입력이 처리되기 전에 OS 파일 시스템 캐시 메모리에 버퍼링되지 않았다는 것을 어떻게 알았습니까/확인 했습니까? 디스크 I/O 오버 헤드를 쉽게 숨길 수 있습니다. 또한 입력이 파싱과 동시에 백그라운드에서 효율적으로 "미리 읽기"될 수 있으므로 시간 내에 더 많은 데이터가 준비 될 수 있습니다. 반드시 단순히 함께 추가 할 것으로 예상 할 수는 없습니다. –

+3

결과는 단순히 디스크 IO이 병목 현상이 아니라 CPU/구문 분석 알고리즘임을 나타낼뿐입니다. – JimmyB

+0

파일 시스템을 메모리 리소스로 대체하면 성능이 향상 될 수 있다고 생각한다면, 20 년 전 가장 최근의 운영 체제가 될 수 있으므로 오늘 운영 체제에 대해 더 자세히 읽어 보시기 바랍니다. 오늘날 OS는 물리적 fs와 메모리의 사용 균형을 맞추기 때문에 프로그램의 메모리 사용 (프로그램 alloc/dealloc) 및 fs (파일 이름 사용, 읽기/쓰기 등)와 아무런 관련이 없습니다. fs 대신 mem을 사용하면 swapping으로 인해 OS에 의해 ... fs의 사용이 증가 할 수 있습니다. OTOH 파일도 메모리에 "캐싱"됩니다. – Ethouris

답변

0

성능 결과에서 언급했듯이 파싱 시간은 일정하므로 두 방법 모두 파싱되는 것보다 빠르게 파일을 읽습니다. 따라서 속도 병목 현상은 구문 분석 자체이며 파일을 더 빨리 읽는 것은 성능에 도움이되지 않습니다. 코드를 더 최적화하려면 파서에 뭔가를해야합니다.

관련 문제