2010-04-05 7 views
2

Je souhaite copier un répertoire et les deux fichiers situés en dessous dans un autre emplacement partagé de stockage partagé. Est-il possible de combiner les trois (un répertoire et deux fichiers) comme une écriture de fichier continu et de le décomposer d'un autre côté pour économiser le coût? Je suis limité au langage c et à Unix/Linux. Je considère créer une structure avec l'information d'inode et obtenir les données au récepteur.Copie efficace du répertoire entier

Merci!

+2

Pourquoi ne pas simplement utiliser 'cp -r'? –

+0

Je travaille sur un système distribué qui est écrit en C, et la performance est très concernée par cette littérature. –

+1

Voulez-vous dire comme verser un pot d'eau dans un autre? –

Répondre

5

rsync est ce que vous cherchez. Ou du goudron si vous avez envie de travailler avec la coquille de l'autre côté.

0

La meilleure optimisation que vous pouvez faire est d'utiliser de grands tampons pour la copie. Si cela ne suffit pas, restructurez vos données pour qu'elles forment un fichier unique au lieu de deux fichiers dans un répertoire. La prochaine étape consiste à obtenir un matériel plus rapide.

De nombreux systèmes de fichiers sont couramment utilisés pour Unix/Linux et vous devez écrire un algorithme de copie personnalisé pour chacun. Il y a rarement une garantie de blocs contigus pour un seul fichier, et encore moins deux. Les chances sont également bonnes que votre routine de copie de bloc contourne et soit moins efficace que les optimisations de système de fichiers existantes. Lire un fichier entier en mémoire avant de l'écrire donnera plus d'avantages en termes de minimisation des temps de recherche que l'ouverture de moins de fichiers, au moins pour les fichiers dépassant une certaine taille. Et tout le matériel ne souffre pas des temps de recherche.

+0

Merci! C'est exactement ce que je veux faire. Avez-vous des conseils pour le faire? Nous pouvons ignorer le répertoire et ne considérer que le cas de deux fichiers, a, et b. Je vais d'abord mmap fichier a et b à une mémoire continue. puis copiez le tampon entier la destination. Mais dans ce cas, je vais seulement obtenir un gros fichier à destination. Je ne suis pas au courant de la façon de reconstruire le gros fichier en deux fichiers à faible coût. Avez-vous un indice? Je suppose que nous pouvons probablement réinitialiser le début du fichier, mais je ne sais pas comment le faire. Merci, –

+0

Si vous n'avez pas besoin de conserver les métadonnées sur les fichiers, comme les noms et les dates, il suffit d'écrire la longueur de chaque fichier avant le contenu. Si vous devez conserver des métadonnées, utilisez un format d'archive standard tel que tar ou zip sans compression. Avec exactement deux fichiers, vous pouvez simplement écrire le décalage de l'endroit où le second fichier démarre. – drawnonward

0

Pour une raison quelconque, cpio est souvent préféré au goudron pour cela.

Vous pouvez, par exemple, rediriger cpio vers une session ssh exécutant cpio à distance.

+0

Voulez-vous dire s/svn/ssh /? De toute façon, le goudron peut le faire aussi. – ephemient

+0

oui bien sûr. ssh. –

Questions connexes