J'ai un fichier texte avec un mot dans chaque ligne, la taille du fichier est de 800 Go. J'ai besoin de trier les mots par ordre alphabétique.
J'ai essayé d'utiliser le programme de tri Windows en utilisant:
sort.exe input.txt /o output.txt
ce qui donne l'erreur: Pas assez de mémoire principale pour terminer le tri.
J'ai 32 Go de RAM, donc lorsque j'essaie de spécifier 10 Go de mémoire pour le tri en utilisant:
sort.exe input.txt /o output.txt /M 10000000
Je reçois:
Avertissement: la taille de mémoire spécifiée est réduite à la mémoire de pagination disponible.
L'enregistrement d'entrée dépasse la longueur maximale. Spécifiez un maximum plus grand.
Quelles sont mes options?
Réponses:
Quelles sont mes options?
Essayez Freeware Command Line Sort Utility CMSort .
Il utilise plusieurs fichiers temporaires, puis les fusionne à la fin.
Un utilisateur signale qu'il a trié un fichier de 130 000 000 octets.
Si vous souhaitez modifier vous-même du code, il existe également Tri de fichiers texte volumineux - CodeProject - "Algorithme de tri des lignes dans les fichiers texte dont la taille dépasse la mémoire disponible"
la source
--parallel
option si vous avez plusieurs cœurs ...)?Une autre option consiste à charger le fichier dans une base de données. EG MySQL et MySQL Workbench.
Les bases de données sont des candidats parfaits pour travailler avec des fichiers volumineux
Si votre fichier d'entrée ne contient que des mots séparés par une nouvelle ligne, cela ne devrait pas être trop difficile.
Après avoir installé la base de données et MySQL Workbench, voici ce que vous devez faire.
Créez d'abord le schéma (cela suppose que les mots ne dépasseront pas 255 caractères, bien que vous puissiez modifier cela en augmentant la valeur de l'argument). La première colonne "idwords" est une clé primaire.
Ensuite, importez les données: EG Cela importera tous les mots dans le tableau (cette étape peut prendre un certain temps. Mon conseil serait de lancer un test avec un petit fichier de mots d'abord et une fois que vous êtes sûr que le format est le même que le plus grand (tronquez le tableau .. IE Effacez-le et chargez l'ensemble de données complet).
Ce lien peut aider à obtenir le bon format pour la charge. https://dev.mysql.com/doc/refman/5.7/en/load-data.html
EG Si vous aviez besoin de sauter la première ligne, vous feriez ce qui suit.
Enfin, enregistrez le fichier trié. Cela peut prendre un certain temps en fonction de votre ordinateur.
Vous pouvez également rechercher les données à votre guise. EG Cela vous donnera les 50 premiers mots dans l'ordre croissant (à partir du 0e ou du premier mot).
Bonne chance
Pete
la source
mywords
prendra une éternité. Même avec leLIMIT
, cela prendra aussi longtemps que le tout, car MySQL devra passer par chaque valeurmywords
et les commander. Pour résoudre ce problème, vous devez effectuer les opérations suivantes après avoir terminéLOAD DATA
. Ajoutez un index àmywords
. Maintenant, vous pouvez commander par cette colonne et ne pas le faire prendre un millénaire. Et il est préférable d'ajouter l'index après le chargement des données plutôt qu'au moment où vous avez créé la table (chargement des données beaucoup plus rapide).sort
Il existe de nombreux algorithmes utilisés pour trier les fichiers ordonnés et non ordonnés [ 1 ] .
Puisque tous ces algorithmes sont déjà implémentés, choisissez un programme déjà testé.
Dans coreutils (à partir de Linux mais également disponible pour Windows [ 2 ] ), il existe la
sort
commande capable de s'exécuter en parallèle sous des processeurs multi-cœurs: généralement c'est suffisant.Si votre fichier est si volumineux, vous pouvez aider au traitement du fractionnement (
split -l
), du fichier dans certains morceaux, en utilisant éventuellement l'option parallèle (--parallel
), et en triant les morceaux ordonnés résultants avec l'-m
option ( tri par fusion ).Une des nombreuses façons de le faire est expliquée ici (fichier divisé, commander des morceaux simples, fusionner des morceaux ordonnés, supprimer des fichiers temporaires).
Remarques:
(Par exemple, un tri à bulles est l'algorithme le plus rapide pour un fichier déjà ordonné - exactement N -, mais il n'est pas efficace dans d'autres cas).
la source
Pour offrir une solution alternative à Peter H, il existe un programme q qui autorise les commandes de style SQL contre les fichiers texte. La commande ci-dessous ferait de même (exécutée à partir de l'invite de commande dans le même répertoire que le fichier), sans avoir besoin d'installer SQL Workbench ou de créer des tables.
c1
est un raccourci pour la colonne 1.Vous pouvez exclure les mots en double avec
et envoyer la sortie vers un autre fichier
la source
Si les mots de chaque ligne proviennent d'un vocabulaire limité (comme l'anglais), vous pouvez trier la liste en O (n + m log m) en utilisant une TreeMap et en comptant les enregistrements (où m est le nombre de valeurs uniques).
Sinon, vous pouvez utiliser le grand trieur de la bibliothèque java . Il divise l'entrée en fichiers intermédiaires triés et les fusionne efficacement (O global (nlogn)). Pour trier votre fichier ressemble à ceci:
J'ai créé un fichier de 1,7 Go (100 m de lignes) avec des mots de 16 caractères générés de manière aléatoire et trié comme ci-dessus en 142 secondes et en fonction de la complexité de calcul O (n log n) de la méthode que j'utilise, j'estime que 800 Go de mots de 16 caractères seraient prendre environ 24 heures pour trier un seul thread sur mon ordinateur portable i5 2,3 GHz avec SSD.
la source