Je recherche des algorithmes de tri qui peuvent fonctionner sur une grande quantité de données, c'est-à-dire qui peuvent fonctionner même lorsque l'ensemble de données ne peut pas être conservé dans la mémoire principale à la fois.
Le seul candidat que j'ai trouvé jusqu'à présent est le tri par fusion: vous pouvez implémenter l'algorithme de telle sorte qu'il analyse votre ensemble de données à chaque fusion sans conserver toutes les données dans la mémoire principale à la fois. La variation du type de fusion que j'ai en tête est décrite dans cet article dans la section Utilisation avec des lecteurs de bande .
Je pense que c'est une bonne solution (avec la complexité O (nx log (n)) mais je suis curieux de savoir s'il existe d'autres algorithmes de tri (éventuellement plus rapides) qui peuvent fonctionner sur de grands ensembles de données qui ne tiennent pas dans la mémoire principale.
ÉDITER
Voici quelques détails supplémentaires, comme requis par les réponses:
- Les données doivent être triées périodiquement, par exemple une fois par mois. Je n'ai pas besoin d'insérer quelques enregistrements et de trier les données de manière incrémentielle.
- Mon exemple de fichier texte est d'environ 1 Go de texte UTF-8, mais je voulais résoudre le problème en général, même si le fichier faisait, disons, 20 Go.
- Il ne se trouve pas dans une base de données et, en raison d'autres contraintes, il ne peut pas l'être.
- Les données sont transférées par d'autres sous forme de fichier texte, j'ai mon propre code pour lire ce fichier texte.
- Le format des données est un fichier texte: les nouveaux caractères de ligne sont des séparateurs d'enregistrement.
Une amélioration possible que j'avais en tête était de diviser le fichier en fichiers suffisamment petits pour être triés en mémoire, et enfin de fusionner tous ces fichiers en utilisant l'algorithme que j'ai décrit ci-dessus.