2014-05-17 5 views
-1

전체 파일을 문자열로 읽습니다. 이것은 매우 빠릅니다. (예제 180Mb 파일의 경우 - 2s) 그런 다음 >> 연산자를 사용하여 문자열에서 일부 값을 추출한 다음 배열에서 여러 배열을 만들고 구조체에 배열을 삽입하고 각 구조체를 벡터에 추가합니다. (아무것도하지만 어쩌면 당신이 할 기운)텍스트 파일에서 빠른 데이터 구문 분석

  1. 가 빠른 >> 접근 방식이 매우 느리기 때문에

    나는, 병목 현상을 찾기 위해 노력하고있어?

    string str; // gets filled with the file 
    struct A; 
    std::vector<A> b; // global variables 
    // in the function inside the loop 
    str >> a.val 
    A a; 
    b.push_back(a); 
    
  2. 는 벡터는 A의 소유권을 가져 않거나 사본을합니까? 아직도 스택에 있습니까? 약 60.000 구조체를 벡터에 삽입 할 수 있습니다. 이것은 빠른 접근 방법인가, 아니면 더 나은 접근 방법인가?

+0

'std :: vector'는'a'의 복사본을 취합니다. 그래도'std :: vector :: emplace'를 사용하면이를 피할 수 있습니다. – 101010

+0

원칙적으로 코드는 괜찮습니다! 그렇지 않으면 귀하의 질문이 너무 광범위합니다, 미안 해요! 사용 가능한 [C++ 참조] (http://en.cppreference.com)를 참조하십시오. –

답변

2

질문은 >> 빠른 접근 방법입니까?

응답 빠른 것은 상대적입니다. 당신은 그것을 무엇과 비교합니까?

질문 벡터가 벡터의 소유권을 가져 오나요, 아니면 복사본을 만드나요?

응답std::vector::push_back()은 입력 개체의 복사본을 만듭니다.

질문 아직 스택에 있습니까?

응답 게시 된 코드에 의해서만 판단됩니다. 예, Ab이 스택에 있습니다.

Queston 나는 벡터에 삽입 얻을 약 60.000 구조체가 있습니다. 이것은 빠른 접근인가, 아니면 더 나은 접근인가?

대답 당신은 필요한 크기로 b를 만들고 b의 개체에 직접 데이터를 읽어 몇 가지 성능을 얻을 수 있습니다.

std::vector<A> b(60000); 
for (i = 0; ; ++i /* Use whatever looping construct you can */) 
{ 
    str >> b[i].val; 
} 

업데이트

당신은, 쓰기 및 바이너리 형태로 데이터를 읽는 것이 가장 빠른 것 할 수있는 경우. 데이터를 쓰려면 std::ostream::write()을 사용하고 데이터를 읽으려면 std::istream::read()을 사용하십시오.

관련 문제