대용량 CSV 파일 (~ 450MB)을 구문 분석하고 있습니다. 파서는 ifstream
과 getline
을 기반으로합니다. 이것은 잘 작동하지만 시간이 좀 걸립니다. 시간을 단축하기 위해 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
를 사용하여 동시에 파일을 구문 분석보다 더 빨리 아니라고,인가?
비 압축 입력이 처리되기 전에 OS 파일 시스템 캐시 메모리에 버퍼링되지 않았다는 것을 어떻게 알았습니까/확인 했습니까? 디스크 I/O 오버 헤드를 쉽게 숨길 수 있습니다. 또한 입력이 파싱과 동시에 백그라운드에서 효율적으로 "미리 읽기"될 수 있으므로 시간 내에 더 많은 데이터가 준비 될 수 있습니다. 반드시 단순히 함께 추가 할 것으로 예상 할 수는 없습니다. –
결과는 단순히 디스크 IO이 병목 현상이 아니라 CPU/구문 분석 알고리즘임을 나타낼뿐입니다. – JimmyB
파일 시스템을 메모리 리소스로 대체하면 성능이 향상 될 수 있다고 생각한다면, 20 년 전 가장 최근의 운영 체제가 될 수 있으므로 오늘 운영 체제에 대해 더 자세히 읽어 보시기 바랍니다. 오늘날 OS는 물리적 fs와 메모리의 사용 균형을 맞추기 때문에 프로그램의 메모리 사용 (프로그램 alloc/dealloc) 및 fs (파일 이름 사용, 읽기/쓰기 등)와 아무런 관련이 없습니다. fs 대신 mem을 사용하면 swapping으로 인해 OS에 의해 ... fs의 사용이 증가 할 수 있습니다. OTOH 파일도 메모리에 "캐싱"됩니다. – Ethouris