2017-12-20 1 views
1

OpenMP를 사용하여 디스크에서 많은 행을 포함하는 큰 파일을 읽고 싶습니다. 한 가지 방법은 seekg() 기능을 사용하는 것 같습니다. 하지만 두통 부분은 seekg() 파일 인덱스를 특정 바이트로 이동하는 기능 만 지원합니다.C++ 파일마다 각 줄을 정렬하는 방법은 무엇입니까?

각 행의 크기가 정확히 동일하면 올바르게 작동합니다. 그러나 각 줄의 크기가 완전히 다른 경우 어떻게해야하는지 모릅니다. 그래서 나에게 힌트를 줄 수 있니?

답변

1

한가지 가능성 : 엔딩 라인에 상관없이

  • 분할 바이트, 각각의 병렬 작업 하나에 기초하여 동일한 크기의 청크로 파일.
  • 각 작업을 해당 청크의 시작 부분으로 검색 한 다음 을 읽고 행 끝 부분을 찾을 때까지 문자를 무시합니다. 그러면 줄 시작 부분에서 파일 처리를 시작할 수 있습니다. (특수한 경우로서, 오프셋 0에서 시작하는 작업은 이미 행의 시작 부분에 있기 때문에 수행하지 않아야합니다.)
  • 작업이 청크의 끝에 도달하면 (즉, 다음 청크가있는 바이트 오프셋 시작), 그 지점을 지나서 계속 읽으십시오 현재 줄의 끝에. (특별한 경우로, 마지막 덩어리의 끝도 파일의 끝이기 때문에 그 지점을 지나서 읽을 수는 없습니다.)

기본적으로 바이트 오프셋을 기준으로 경계를 선택했지만 이동합니다 그것들은 줄 끝과 일치하기 위해 앞으로 나아 간다. 각 작업은 해당 청크의 시작 부분에서 일부 문자를 건너 뜁니다. 이러한 문자 대신 이전 청크의 끝을 지나가는 다른 작업이 처리합니다.

(내가 하둡은 기본적으로 텍스트 기반의 입력 파일을 분할하는 방법이 BTW, 믿습니다.)

+0

감사합니다 ~ 내가 디스크에 바이트 대신 문자열을 저장하는 코드를 수정했습니다. 그리고 그 작품! – uniqueliu

+0

파일은 항상 바이트를 보유하므로 문자열 대신 바이트를 저장하는 것이 무엇을 의미하는지 명확하지 않습니다. 하지만 한 가지 가능한 오해를 피하려면 : 파일을 여러 조각으로 나누라고 말하면 실제로 파일을 작은 파일로 분할해야한다는 의미는 아닙니다. 모든 텍스트를 하나의 파일에 보관할 수 있지만 작업 내에서 찾을 간격이 일정한 위치를 선택하기 만하면됩니다. – Wyzard

+0

또 다른 한 가지 : 작업이 한 줄의 결말도 찾지 않고 청크의 끝에 도달하면 텍스트를 전혀 처리하지 않고 작업을 중단해야합니다. 즉, 세 개 이상의 청크에 걸쳐 긴 줄이 있고 중간에있는 청크를 보는 작업은 해당 줄 또는 다음 줄의 시작을 볼 수 없기 때문에 아무 것도 할 수 없습니다. 해야 할 것. – Wyzard

관련 문제