J'ai un PC équipé d'un processeur Intel (R) Pentium (CPU) G640 à 2,80 GHz et de 8 Go de RAM. J'utilise Scientific Linux 6.5 avec le système de fichiers EXT3.
Sur cette configuration, quel est le moyen le plus rapide de créer sort -u
un fichier de 200 gigaoctets?
Dois-je diviser le fichier en fichiers plus petits (moins de 8 Go), sort -u
les assembler, puis les diviser à nouveau dans une taille différente sort -u
, etc.? Ou existe-t-il des scripts de tri, des programmes capables de gérer des fichiers aussi gros avec ma quantité limitée de RAM?
/tmp
.parallel
pour cela, je pense, plutôt que de moreutilsparallel
qui est installé par défaut sur certains systèmes.sort(1)
pourrait manquer d'espace sur/tmp
; Si tel est le cas, vous pouvez désigner une autre zone pour les fichiers temporaires avec la variable d'environnementTMPDIR
, ou-T=<tmpdir>
Réponses:
GNU
sort
(qui est la valeur par défaut sur la plupart des systèmes Linux) a une--parallel
option. De http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html :Puisque votre cpu a 2 cœurs, vous pourriez faire:
Il est préférable de spécifier le nombre réel de cœurs car cela peut sembler être davantage dû au fait que le processeur possède un hyper-threading .
Vous pouvez également essayer
nice
d’influencer la priorité d’ordonnancement du processeur etionice
d’ordonnancement des E / S. Vous pouvez augmenter la priorité par rapport à d'autres processus tels que celui-ci. Je ne pense pas que cela vous permettra de réaliser d'importantes économies car ils sont généralement mieux adaptés pour garantir qu'un processus d'arrière-plan n'utilise pas trop de ressources. Néanmoins, vous pouvez les combiner avec quelque chose comme:Notez également que, comme l'a commenté Gilles , l'utilisation d'une seule commande de tri GNU sera plus rapide que toute autre méthode permettant de décomposer le tri car l'algorithme est déjà optimisé pour gérer des fichiers volumineux. Tout le reste va probablement ralentir les choses.
la source
sort
directement est mieux que tout ce que vous pourriez bricoler. Le tri GNU est conçu pour bien gérer les fichiers beaucoup plus volumineux que la RAM.L'utilisation de la
sort
commande sera probablement l'option la plus rapide.Mais vous voudrez probablement fixer les paramètres régionaux à C.
sort -u
ne rapporte pas de lignes uniques, mais une de chaque série de lignes qui trient de la même manière. Dans les paramètres régionaux C, deux lignes différentes ne trient pas nécessairement de la même façon, mais ce n'est pas le cas dans la plupart des paramètres régionaux basés sur UTF-8 sur les systèmes GNU.De plus, l'utilisation de la locale C évite les coûts supplémentaires liés à l'analyse du format UTF-8 et au traitement des ordres de tri complexes, ce qui améliorerait considérablement les performances.
Alors:
Vous pouvez également améliorer les performances en utilisant un lecteur plus rapide (ou un lecteur différent de celui où se trouvent les fichiers d'entrée et / ou de sortie) des fichiers temporaires (à l'aide de
-T
ou$TMPDIR
variable d'environnement), ou en jouant avec l'-S
option prise en charge par certainssort
implémentations) .Pour certains types d'entrée ou pour un stockage lent, l'utilisation de l'
--compress-program
option GNUsort
(avec, par exemplelzop
) peut améliorer les performances en plus de l'utilisation du stockage.la source
Voici un script bash prêt à l’emploi permettant de trier les données d’échelle TB sur une machine standard avec quelques Go de mémoire vive: http://sgolconda.blogspot.com/2015/11/sort-very-large-dataset.html Il vérifie le nombre de Noyaux de votre machine comme et utilise tous les noyaux. Peut trier, fichiers numériques ou chaînes. Peut être utilisé pour trouver des enregistrements uniques dans les données d’échelle TB.
la source