2011-04-20 4 views
1

Je dois fusionner environ 30 fichiers texte gzip, d'environ 10-15 Go compressés, chacun contenant des enregistrements multilignes, chacun étant trié par la même clé. Les fichiers résident sur un partage NFS, j'ai accès à eux depuis plusieurs nœuds, et chaque nœud a son propre système de fichiers. Quel serait le moyen le plus rapide de s'y prendre?Fusionner efficacement les fichiers triés

Quelques solutions possibles:

A. Laissez-le tout sort -m. Pour ce faire, j'ai besoin de passer chaque fichier d'entrée à travers awk/sed/grep pour réduire chaque enregistrement en une ligne et extraire une clé qui serait comprise par sort. Je voudrais donc obtenir quelque chose comme

sort -m -k [...] <(preprocess file1) [...] <(preprocess filen) | postprocess

B. Regardez dans Python heapq.merge. C. Ecrire mon propre code C pour ce faire. Je pouvais fusionner les fichiers en petits lots, faire un fil de OMP pour chaque fichier d'entrée, une pour la sortie, et un en train de faire la fusion dans la RAM, etc.

options pour tous les ci-dessus:

D Fusionner quelques fichiers à la fois, dans un tournoi.

E. Utilisez plusieurs nœuds pour cela, en copiant les résultats intermédiaires entre les nœuds.

Que recommanderiez-vous? Je n'ai pas beaucoup d'expérience sur l'efficacité du stockage secondaire, et en tant que tel, j'ai du mal à estimer comment l'un ou l'autre fonctionnerait.

+0

Avez-vous envisagé d'attaquer le problème plus près de son origine? Par exemple. vous pourriez être en mesure d'effectuer un tri de fusion sans prétraitement si vos fichiers texte ont été créés en ligne plutôt qu'en mode d'enregistrement (plusieurs lignes). – Jens

Répondre

2

Si vous optez pour votre solution B impliquant heapq.merge, alors vous serez ravis de savoir que Python 3.5 ajoute un paramètre key à heapq.merge() selon docs.python.org, bugs.python.org et github.com. Ce sera une excellente solution à votre problème.

Questions connexes