Concaténer rapidement plusieurs fichiers sous Linux
Je suis à l'aide de Python multitraitement de générer un temporaire du fichier de sortie par processus. Ils peuvent être de plusieurs go en taille et je fais plusieurs dizaines de ces. Ces fichiers temporaires doivent être concated pour former la sortie désirée et c'est l'étape qui s'avère être un goulot d'étranglement (et un parallélisme killer). Est-il un Linux outil qui permettra de créer le concated fichier en modifiant le système de fichier de méta-données et de ne pas copier le contenu ? Aussi longtemps que cela fonctionne sur tout système Linux qui serait acceptable pour moi. Mais un système de fichiers spécifique de la solution ne sera pas d'une grande aide.
Je ne suis pas d'OS ou CS formés, mais en théorie, il semble qu'il devrait être possible de créer un nouvel inode et de copier sur l'inode du pointeur de la structure de la inodes des fichiers que j'ai désirez copier, puis de dissocier ces inodes. Est-il un utilitaire qui va le faire ? Compte tenu de la surabondance de bien pensé utilitaires unix je m'attendais, mais ne pouvait pas trouver quoi que ce soit. D'où ma question sur. Le système de fichiers sur un périphérique bloc, un disque dur en fait, dans le cas où cette information. Je n'ai pas la confiance d'écrire cela sur mon propre, je n'ai jamais fait de tout les systèmes de programmation au niveau de l'avant, de sorte que tous les pointeurs (C/Python code snipppets) vous sera très utile.
source d'informationauteur san
Vous devez vous connecter pour publier un commentaire.
Même si il y avait un tel outil, cela ne peut fonctionner que si les fichiers sauf le dernier
ont la garantie d'avoir une taille qui est un multiple du système de fichiers du bloc
la taille de l'.
Si vous contrôlez la façon dont les données sont écrites dans les fichiers temporaires, et vous savoir
comment de grands chacun, à la place, vous pouvez effectuer les opérations suivantes
Avant de commencer le traitement multiple, créer un fichier de sortie, et de grandir
pour la taille finale par
fseek()
ingà la fin, cela va créer une
fichier fragmenté.
Commencer le traitement multiple, en remettant à chaque processus de la FD et le décalage dans ses
particulier de la tranche du fichier.
De cette façon, le processus de collaboration remplir le fichier de sortie unique,
la suppression de la nécessité de chat ensemble plus tard.
MODIFIER
Si vous ne pouvez pas prédire la taille des fichiers individuels, mais le consommateur de la
fichier final peut travailler avec séquentielle (par opposition à accès aléatoire) d'entrée, vous pouvez
alimentation
cat tmpfile1 .. tmpfileN
pour le consommateur, que ce soit sur stdinou par l'intermédiaire de canaux nommés (à l'aide de bash du Processus de Substitution):
Vous indiquez que vous ne savez pas à l'avance la taille de chaque fichier temporaire. Avec cela à l'esprit, je pense que votre meilleur pari est d'écrire un FUSIBLE système de fichiers qui présentera les morceaux comme un seul gros fichier, tout en les gardant en tant que fichiers individuels sur le système de fichiers sous-jacent.
Dans cette solution, votre production et de la consommation des applications restent inchangés. Les producteurs d'écrire un tas de fichiers que le FUSIBLE couche de apparaissent en un seul fichier. Ce fichier est ensuite présenté à la consommation.
FUSIBLE a les fixations pour un tas de langues, y compris Python. Si vous regardez certains des exemples ici ou ici (ce sont pour les différentes liaisons), cela nécessite étonnamment peu de code.
Je ne le pense pas, inode peut être aligné, il peut donc possible uniquement si vous êtes ok pour laisser quelques zéros (ou inconnu octets) entre un fichier de pied de page et un autre en-tête du fichier.
Au lieu de concaténer ces fichiers, je voudrais suggérer à la re-conception de l'outil d'analyse à l'appui de sourcing à partir de plusieurs fichiers. Prendre des fichiers journaux, par exemple, de nombreux journaux analyseurs de support de la lecture des fichiers journaux chaque jour.
MODIFIER
@san: Comme vous le dites le code en cours d'utilisation, vous ne pouvez pas contrôler, eh bien, vous pouvez concaténer les fichiers séparés à la volée en utilisant des canaux nommés:
Pour les 4 fichiers; xaa, xab, xac, xad un rapide concatention en bash (en tant que root):
(Supposons que loop0, loop1, loop2, loop3 sont les noms des nouveaux fichiers de périphériques.)
Mettre http://pastebin.com/PtEDQH7G dans un "join_us" fichier de script. Ensuite, vous pouvez l'utiliser comme ceci:
Alors (si ce gros fichier est un film), vous pouvez donner à sa propriété à un utilisateur normal (chown itsme /dev/mapper/joint) et alors il/elle peut jouer via: mplayer /dev/mapper/joint
Le nettoyage après ceux-ci (en tant que root):
Non, il n'existe aucun outil de ce type ou syscall.
Vous pourriez étudier s'il est possible pour chaque processus d'écrire directement dans le fichier final. Dis processus 1 écrit octets 0-X, 2, écrit-X-2X et ainsi de suite.
Une alternative possible est de chat tous vos fichiers temporaires dans un tube nommé, puis utiliser ce canal nommé en tant que signal d'entrée unique du programme d'entrée. Tant que votre unique d'entrée au programme lit l'entrée de façon séquentielle et ne cherche pas.