Quel est le moyen le plus rapide pour chatter plusieurs fichiers? [en attente]
Je me demandais si il existe un moyen de concaténer les fichiers texte unix plus vite
que de courir cat
?
Voici le problème que je me pose. Je suis de la chaîne de traitement d'un fichier texte ~100G de
taille. Je suis en train d'améliorer l'exécution par diviser le fichier en plusieurs centaines
des fichiers plus petits et de les traiter en parallèle. Au final, j'ai le chat qui en résulte
les fichiers de retour ensemble dans l'ordre. Le fichier en lecture/écriture le temps lui-même prend des heures. J'
aimerai trouver un moyen d'améliorer le suivant:
cat file1 file2 file3 ... fileN >> newBigFile
- Cela nécessite le double de l'espace comme
file1
...fileN
prend 100G, et
puisnewBigFile
prend une autre de 100 go, et puisfile1
...fileN
obtient
retiré - Les données sont déjà dans
file1
...fileN
de faire lecat >>
engage lire
et écrire le temps où tout ce que je vraiment besoin, c'est des centaines de fichiers à
réapparaître comme 1 fichier...
source d'informationauteur Wing
Vous devez vous connecter pour publier un commentaire.
Si vous n'avez pas besoin d'un accès aléatoire à la grande finale de fichier (c'est à dire, vous venez de lire à travers une fois du début à la fin), vous pouvez faire votre des centaines de fichiers intermédiaires apparaissent comme une seule. Où vous le feriez normalement
au lieu de faire
Il utilise Unix processus de substitutionparfois aussi appelé "anonyme canaux nommés."
Vous pouvez également être en mesure d'économiser du temps et de l'espace par la division de votre entrée et de faire le traitement en même temps; GNU Parallèle a un --pipe commutateur qui va faire exactement cela. Il peut également remonter les sorties en arrière dans un grand dossier, éventuellement en utilisant moins d'espace de travail qu'il a seulement besoin de garder nombre de cœurs de morceaux sur le disque à la fois. Si vous êtes littéralement l'exécution de vos centaines de processus en même temps, en Parallèle va considérablement améliorer votre efficacité en vous permettant de régler la quantité de parallélisme à votre machine. Je le recommande fortement.
Peut-être
dd
serait plus rapide car vous n'auriez pas à passer des trucs entre chat et de la coquille. Quelque chose comme:Rapide, mais pas sans solution? Obtenir un disque SSD ou flash PCIe en fonction de stockage. Si c'est quelque chose qui doit être fait sur une base régulière, l'augmentation des e /s disque vitesse va être le plus efficace et le plus rapide speedup vous pouvez obtenir.
Est-il possible pour vous tout simplement de ne pas diviser le fichier? Au lieu traiter le fichier en morceaux en paramètre le pointeur de fichier dans chacun de vos parallèle des travailleurs. Si le fichier doit être traité dans une ligne orientée de manière, qui le rend plus difficile, mais il peut encore être fait. Chaque travailleur doit comprendre que, plutôt que de commencer à le décalage de vous donner, il doit d'abord demander l'octet par octet pour le prochain saut de ligne +1. Chaque travailleur doit aussi comprendre qu'il ne traite pas de la quantité d'octets que vous lui donner, mais doit traiter le le premier saut de ligne après la quantité d'octets qu'il est affecté à traiter.
L'affectation réelle et le réglage du pointeur de fichier est assez simple. S'il y a n travailleurs, chacun des processus de n/taille de fichier octets et le pointeur de fichier commence au niveau du travailleur numéro de l' * n/taille_fichier.
est-il une raison de ce genre de plan n'est pas suffisant?
Lors de la concaténation de fichiers, vous pouvez supprimer les fichiers de petite taille comme ils se sont présentés en annexe:
Cela permettrait d'éviter d'avoir le double de l'espace.
Il n'y a pas d'autre moyen de magie de prise de fichiers comme par magie les concaténer. Le système de fichiers de l'API n'est pas simplement une fonction qui le fait.
Je crois que c'est le moyen le plus rapide pour chat tous les fichiers contenus dans le même dossier:
Il ya une telle chose comme trop de concurrence.
Une meilleure façon de le faire serait d'utiliser random access lit dans le fichier sur les plages désirés et jamais fait de séparer et de traiter uniquement le nombre de fichiers que le nombre de CPU physique/Coeurs de la machine. C'est, sauf que c'est l'envahissement de la disquette avec les IOPS ainsi, alors vous devriez réduire jusqu'à ce que le disque n'est pas le goulot d'étranglement.
Ce que vous faites de toute façon avec tous les naïfs découpage/copier/supprimer génère des tonnes d'e /s et il n'y a pas moyen de contourner le physique de.
Une solution transparente qui serait peut-être plus de travail que vaut-elle moins que ce soit un cours quotidien de la question/le problème est d'écrire une coutume FUSIBLE du système de fichiers qui représente un seul fichier en plusieurs fichiers. Il y a beaucoup d'exemples sur la façon de traiter avec les fichiers d'archive de contenu sous forme de fichiers individuels qui serait de vous montrer les rudiments de la façon de le faire.
tous j'ai vraiment besoin de centaines de fichiers pour réapparaître comme 1 fichier...
La raison pour laquelle il n'est pas possible de simplement joindre des fichiers de cette façon à un niveau de système de fichiers, car les fichiers de texte n'avez pas l'habitude de remplir un bloc de disque exactement, de sorte que les données dans les fichiers suivants devra être déplacé jusqu'à combler les lacunes, provoquant un tas de lectures/écritures de toute façon.