txt 파일에서 5천만 개의 이중 데이터를 읽어서 벡터에 저장해야 합니다. 처음에는 파일 io가 너무 느릴 수 있다고 생각하여 파일 메모리 매핑을 사용하여 파일 내용을 블록으로 메모리에 읽어 들였습니다. 벡터에 하나씩 입력했는데, 파일에서 직접 데이터를 하나씩 읽어오는 데만 3분밖에 걸리지 않았는데, 최적화하고 나니 5분으로 늘어났습니다.
저의 최적화 계획은 전체 파일을 메모리에 읽어와서 char* 버퍼에 넣은 뒤, 메모리 반복 할당을 피하기 위해 vec_name.reserve(50000000)를 이용해 5천만 용량을 할당하는 것인데 별 효과가 없는 것 같습니다. .
Push_back에 주로 시간을 투자해서 그런 걸까요?
좋은 최적화 방법이 있나요? 다들 감사 해요!
최적화된 키 코드는 다음과 같습니다. (모든 데이터를 벡터로 읽어들이는 데 5분 정도 소요)
디버그 모드에서 실행하는 것은 의미가 없습니다. 릴리스 모드에서 실행하기 위해 코드를 사용하면 약 14초밖에 걸리지 않습니다.
문제를 해결하려면 먼저 문제를 찾으세요. 이렇게 코드를 수정하고 먼저 어디에 시간이 소모되는지 알아보세요
으아아아그래서 병목 현상은 "ss_sim >> fVecSim" 문장에 있습니다. atof는 충분히 빠릅니다.
그래서 내 결론은: 궁극적인 최적화 솔루션은 저장 형식으로 시작하여 문자열 대신 바이너리로 데이터를 저장하는 것입니다. 이렇게 하면 문자열 IO 및 변환 기능의 오버헤드를 피하고 실제로 몇 초 만에 데이터를 가져올 수 있습니다.
현재 가장 효율적인 방법은 스트림을 사용하는 것이며 코드 구현에서 볼 수 있습니다. 모든 파일 내용을 한 번에 버퍼로 읽어들이는 것은 최선의 방법이 아닙니다. 매번 평균(1K) 또는 다른 값으로 buffer[1024]를 읽는 것이 좋습니다. 읽은 후 포인터는 다음 줄로 이동하여 EOF 위치 끝까지 계속 읽습니다
1. 데이터 간 종속성이 없으면 블록 단위로 다중 스레드 읽기를 시도할 수 있습니다.
2. 또한 후속 순회가 무작위 액세스가 아닌 경우 목록을 사용하는 것이 더 효율적입니다. 꽤 많은 수.
C 스타일로 전환할 수 있습니다
scanf
Try야, 내 대답을 왜 이렇게 대하는 거야? 저를 신고한 네티즌께서는 이 답변에 왜 문제가 있는 것인지 묻고 싶습니다.