Besoin de haute performance / bin / sort; Aucune suggestion?

Je suis à la recherche d'une chute de haute performance / bin / sort en remplacement. Je sais qu'il y a pbzip2 pour l'utilisation de plusieurs noyaux, mais existe-t-il un produit similaire pour / bin / sort?

J'ai trouvé distsort.sh, mais je veux quelque chose de moins important pour les IO. Je cherche à trier oh … 60 gigs de données sur une base très fréquente.

4 Solutions collect form web for “Besoin de haute performance / bin / sort; Aucune suggestion?”

Le sort GNU a -m qui peut probablement vous aider. Supposons que vous disposez de 200 fichiers .gz que vous souhaitez trier et combiner. Ensuite, vous pouvez utiliser GNU Parallel pour faire:

 seq 1 200 | parallel mkfifo /tmp/{} ls *.gz | nice parallel -j200 'zcat {} | sort >/tmp/$PARALLEL_SEQ' & seq 1 200 | parallel -X sort -m /tmp/{} >/tmp/sorted 

Si l'E / S est le problème et la mémoire n'est pas un problème, utilisez -S pour le premier sort pour vous assurer que tout reste en mémoire. Aussi, vous pouvez utiliser lzop chaque fois que vous écrivez sur le disque (–compress-program = lzop): les disques sont souvent le facteur limitant, de sorte que lzpping à la volée peut vous donner une vitesse supplémentaire. Ou vous pouvez créer un disque RAM et configurer -T sur ce répertoire.

Hrm. Vous allez avoir quelques problèmes ici, je pense. Tout d'abord, vos données d'entrée auront un impact important sur les performances de tri (différents algorithmes fonctionnent mieux ou pire en fonction de la distribution de l'entrée). Cependant, un problème plus important à l'avance est que 60 Go est une multitude de données.

De plus, le tri ne s'arrête pas aussi facilement que la compression car il n'y a pas de garantie de proximité. En d'autres termes, avec compression / décompression, vous pouvez briser l'entrée en morceaux discrets et les utiliser séparément et indépendamment. Une fois que chaque morceau est traité, ils sont simplement concaténés ensemble. Avec le tri, vous avez plusieurs étapes parce que vous ne pouvez pas simplement concaténer les résultats (sauf si vous effectuez un prétraitement), vous devez fusionner les résultats (car une entrée au début des 60 Go pourrait se terminer à côté d'une entrée À la fin des 60 Go, après le tri).

Je peux essentiellement penser à quelques solutions générales ici:

  • Préparez vos données d'une manière amicale au tri et à la recombinaison. Par exemple, si vous procédiez à un tri alphabétique simple, vous pouvez stocker vos données dans 26 seaux, un pour chaque lettre de l'alphabet. Ensuite, vous pouvez trier chaque seau individuellement et les recombiner à la fin. Les détails de la façon dont vous préparez vos données dépendent des données elles-mêmes, de votre méthode de stockage actuelle, etc. Certaines configurations pourraient fonctionner mieux pour celles-ci.
  • Écrivez votre propre front de départ qui fait essentiellement ce que j'ai écrit au dessus, mais à la volée. En d'autres termes, vous disposez d'un script qui lit l'entrée, et basé sur un fonctionnement très rapide (comme la lecture de la première lettre ou tout ce qui fonctionne pour vos données), puis distribue ces données au godet de tri approprié. Chaque type fonctionne indépendamment jusqu'à ce que toutes les données aient été traitées, puis vous les combinez ensemble. C'est plutôt similaire à un cas particulier d'utilisation de MapReduce pour le tri.
  • Utilisez une solution de tri MapReduce. Il existe un projet Open Source appelé Hadoop qui fournit un ensemble de sous-projets, dont l'une est une implémentation Open Source MapReduce. Je ne l'ai jamais utilisé, mais je lis juste à ce sujet. Je ne sais pas si cela serait pratiquement applicable à votre problème particulier.
  • Pouvez-vous indexer les données, puis trier cela? Est-ce que la partie entière de la clé de tri est de 60 Go? Ou est-ce qu'il y a une partie plus petite que vous gérez, puis un tas de données supplémentaires pour chaque pièce? Si c'est le dernier, l'indexation et le tri juste une sorte de valeur de clé, et ensuite chercher les données supplémentaires au besoin, pourrait être le chemin à parcourir.
  • Peut-être que vous pouvez complètement trier vos données et la maintenir dans un état trié. Chaque fois que vous ajoutez ou actualisez les données, vous le corrigez à partir d'une perspective triée. Cette solution serait très dépendante de la façon dont vous stockez vos données et de savoir si l'impact sur les performances des mises à jour de type serait acceptable.
  • Enfin, vous pourriez vous informer de tout. Dump vos données dans un RDBMS (j'aime PostgresSQL moi-même), et laissez la base de données gérer votre tri pour vous.

Sans savoir beaucoup plus sur vos données et les détails de ce que vous faites, c'est à propos du meilleur que je peux proposer pour des suggestions.

[Note: Je ne suis pas un expert sur le tri, afin que quelqu'un plus intelligent que moi puisse signaler des erreurs dans ma logique, ou des suggestions pour améliorer ces.]

Dans la recherche, j'ai trouvé beaucoup de références aux documents académiques et à un produit commercial appelé Nsort . Je ne sais rien à ce sujet, sauf que leur site Web prétend que:

Nsort est un programme de tri / fusion qui peut trier rapidement de grandes quantités de données, en utilisant un grand nombre de processeurs et de disques en parallèle. Unique dans son efficacité CPU, Nsort est le seul programme de tri commercial à démontrer:

  • 1 types de Terabytes (33 minutes)
  • Tarifs de lecture et d'écriture de 1 gigaoctet / sec

Nsort a une longue histoire de triage des ensembles de données de production massives, tels que:

  • Logs Web pour les sites Web à fort trafic
  • Journal des téléphones
  • Données de l'agence gouvernementale

Perl?

Edit: Eh bien, cet article porte sur Perl sort perf tunning. D'après ce que je peux comprendre, il s'agit essentiellement d'un guide de meilleures pratiques, en comparant comment un mauvais code de tri peut rendre votre programme très lent, et le contraire, comment le rendre plus rapide.

Programmation superficielle, performances négligées.

Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de réseau.