대량의 데이터에서 작동 할 수있는 정렬 알고리즘을 찾고 있습니다. 즉, 전체 데이터 세트를 한 번에 주 메모리에 유지할 수없는 경우에도 작동 할 수 있습니다.
내가 지금까지 찾은 유일한 후보는 병합 정렬입니다. 메인 메모리의 모든 데이터를 한 번에 유지하지 않고 각 병합에서 데이터 세트를 스캔하는 방식으로 알고리즘을 구현할 수 있습니다. 필자가 생각한 병합 정렬의 변형은 이 문서의 테이프 드라이브 사용 섹션에 설명되어 있습니다 .
이것이 좋은 해결책이라고 생각합니다 (복잡성 O (nx log (n))) 그러나 주 메모리에 맞지 않는 큰 데이터 세트에서 작동 할 수있는 다른 (아마도 더 빠른) 정렬 알고리즘이 있는지 궁금합니다.
편집하다
답변에 필요한 자세한 내용은 다음과 같습니다.
- 데이터는 주기적으로 (예 : 한 달에 한 번) 정렬해야합니다. 몇 개의 레코드를 삽입 할 필요가 없으며 데이터를 증분 정렬했습니다.
- 내 예제 텍스트 파일은 약 1GB UTF-8 텍스트이지만 파일이 20GB 인 경우에도 일반적으로 문제를 해결하고 싶었습니다.
- 데이터베이스에 없으며 다른 제한 조건으로 인해 사용할 수 없습니다.
- 데이터는 다른 사람들이 텍스트 파일로 덤프합니다.이 텍스트 파일을 읽는 자체 코드가 있습니다.
- 데이터 형식은 텍스트 파일입니다. 줄 바꾸기 문자는 레코드 구분 기호입니다.
내가 생각한 한 가지 개선 사항은 파일을 메모리에 정렬하기에 충분히 작은 파일로 분할하고 마지막으로 위에서 설명한 알고리즘을 사용하여 이러한 파일을 모두 병합하는 것이 었습니다.