Sto cercando algoritmi di ordinamento in grado di lavorare su una grande quantità di dati, cioè che possono funzionare anche quando l'intero set di dati non può essere tenuto nella memoria principale in una sola volta.
L'unico candidato che ho trovato fino ad ora è merge sort: è possibile implementare l'algoritmo in modo tale da eseguire la scansione del set di dati in ogni unione senza tenere tutti i dati nella memoria principale in una volta. La variante di merge sort che ho in mente è descritta in questo articolo nella sezione Uso con unità nastro .
Penso che questa sia una buona soluzione (con complessità O (nx log (n)) ma sono curioso di sapere se ci sono altri algoritmi di ordinamento (possibilmente più veloci) che possono lavorare su insiemi di dati di grandi dimensioni che non si adattano al principale la memoria.
Modifica
Ecco alcuni dettagli in più, come richiesto dalle risposte:
- I dati devono essere ordinati periodicamente, ad es. una volta al mese Non ho bisogno di inserire alcuni record e avere i dati ordinati in modo incrementale.
- Il mio file di testo di esempio è di circa 1 GB di testo UTF-8, ma volevo risolvere il problema in generale, anche se il file fosse, diciamo, di 20 GB.
- Non si trova in un database e, a causa di altri vincoli, non può essere.
- I dati vengono scaricati dagli altri come file di testo, ho il mio codice per leggere questo file di testo.
- Il formato dei dati è un file di testo: i nuovi caratteri di riga sono separatori di record.
Un possibile miglioramento che avevo in mente era quello di dividere il file in file abbastanza piccoli da essere ordinati in memoria e infine unire tutti questi file usando l'algoritmo che ho descritto sopra.