2010-08-03 4 views
5

ASCII로 저장된 큰 부동 소수점 파일을 구문 분석하는 가장 좋은 방법은 무엇입니까?ASCII에 저장된 큰 부동 소수점 파일을 구문 분석하는 가장 좋은 방법은 무엇입니까?

가장 빠른 방법은 무엇입니까? 누군가가 ifstream을 사용하여 나쁘다고 말한 것을 기억합니다. 바이트 수가 적기 때문에 파일을 메모리로 먼저 읽는 것이 낫습니다. 그게 사실이야?

편집 : Windows에서 실행 중이며 파일 형식은 xyz rg와 같은 행에 저장되는 포인트 클라우드 용입니다. b. 배열로 읽으려고합니다. 또한 파일은 각각 약 120   MB이지만 약 10 개가 있습니다.   GB 상당의 파일이 있습니다.

두 번째 편집 : 시각화를 수행 할 때마다 표시 할 파일을로드해야하므로 가능한 한 빨리 처리하는 것이 좋지만 솔직히 ifstream이 합리적으로 선행하면 I wouldn 마음을 읽을 수있는 코드를 고집합니다. 지금은 꽤 느리게 실행되고 있지만 소프트웨어에서 할 수있는 것보다 하드웨어 I/O 제한이 더 많을 수도 있습니다. 단지 확인하고 싶었습니다.

+0

부동 소수점 숫자가 많은 큰 파일을 의미합니까? –

+0

"최고"는 항상 "가장 빠름"을 의미하지는 않습니다. – strager

+1

파일의 크기는 어느 정도입니까? 너는 이미 충분히 빠르지 않은 일상을 가지고 있니? –

답변

4

여러분의 첫 번째 관심사는 부동 소수점 숫자가 얼마나 커야할까요? 그들은 떠 다니거나 두 배의 데이터가있을 수 있습니까? 전통적인 (C) 방식은 fscanf를 float 형식 지정자와 함께 사용하는 것이고 afaik는 다소 빠릅니다. iostream은 데이터를 파싱하는 측면에서 약간의 오버 헤드를 추가하지만 이는 무시할 수 있습니다. 간결함을 위해 iostream을 사용하는 것이 좋습니다 (일반적인 스트림 기능은 말할 것도없고).

또한 예를 들어 파일의 크기를 파싱하려는 것과 같은 질문에 관련 숫자를 추가 할 수 있다면 커뮤니티에 큰 도움이 될 것이라고 생각합니다. 이것은 임베디드 시스템과 같은 작은 메모리 공간입니다.

0

가장 빠른 방법은 ifstream을 사용하는 것이지만 fscanf를 사용할 수도 있습니다. 특정 플랫폼을 사용하는 경우 파일을 메모리에 수동로드하여 수동으로 플로트를 파싱 할 수 있습니다.

1

운영체제와 C 및 C++ 표준 라이브러리를 기반으로합니다.

ifstream이 느린 날은 거의 끝나지만 C++ 일반 인터페이스를 처리하는 데 약간의 오버 헤드가있을 수 있습니다.

atof/strtod가 문자열이 이미 메모리에있는 경우이를 처리하는 가장 빠른 방법 일 수 있습니다.

마지막으로 파일을 메모리에 읽어들이려는 시도는 효과가 없습니다. 최신 운영 체제는 일반적으로 방해가됩니다 (특히 파일이 RAM보다 큰 경우 시스템에서 사용자의 (이미 디스크에 저장되어있는) 데이터를 스왑 가능으로 처리하므로 코드 스왑이 종료됩니다).

엄청나게 빠를 필요가 있다면 (HPC 및 Map/Reduce 기반 접근법이 유용 할 거라고 생각할 수있는 유일한 곳) - 가상 메모리로 프리 페치 된 파일을 얻으려면 mmap (Linux/Unix) 또는 MapViewOfFile을 시도하십시오 가장 합리적인 방법으로, 그리고 atof + 사용자 정의 문자열 처리.

파일이 이러한 종류의 게임을 위해 실제로 잘 구성되어 있다면 mmaps 및 포인터를 사용하여 색다른 게임을 만들 수 있으며 변환이 멀티 스레드로 이루어질 수도 있습니다. 정기적으로 변환 할 수있는 10GB 이상의 수레가있는 경우 재미있는 운동과 같음

관련 문제