Estou procurando algoritmos de classificação que possam funcionar com uma grande quantidade de dados, ou seja, que funcionem mesmo quando todo o conjunto de dados não puder ser mantido na memória principal de uma só vez.
O único candidato que eu encontrei até agora é a classificação por mesclagem: é possível implementar o algoritmo de forma que ele varra seu conjunto de dados em cada mesclagem sem manter todos os dados na memória principal de uma só vez. A variação da classificação de mesclagem que tenho em mente é descrita neste artigo na seção Usar com unidades de fita .
Eu acho que essa é uma boa solução (com complexidade O (nx log (n)), mas estou curioso para saber se existem outros algoritmos de classificação (possivelmente mais rápidos) que podem funcionar em grandes conjuntos de dados que não cabem na memória principal.
EDITAR
Aqui estão mais alguns detalhes, conforme exigido pelas respostas:
- Os dados precisam ser classificados periodicamente, por exemplo, uma vez em um mês. Não preciso inserir alguns registros e ter os dados classificados de forma incremental.
- Meu arquivo de texto de exemplo tem cerca de 1 GB de texto UTF-8, mas eu queria resolver o problema em geral, mesmo que o arquivo tivesse, digamos, 20 GB.
- Ele não está em um banco de dados e, devido a outras restrições, não pode estar.
- Os dados são despejados por outros como um arquivo de texto, eu tenho meu próprio código para ler esse arquivo de texto.
- O formato dos dados é um arquivo de texto: os novos caracteres de linha são separadores de registros.
Uma possível melhoria que eu tinha em mente era dividir o arquivo em arquivos pequenos o suficiente para serem classificados na memória e, finalmente, mesclar todos esses arquivos usando o algoritmo que descrevi acima.