2012-02-09 1 views
5

J'ai besoin de copier toutes les clés de '/ old/dir /' à '/ new/dir /' dans un seau amazon S3. je suis venu avec ce script (hack rapide):Comment copier efficacement tous les fichiers d'un répertoire à un autre dans un seau Amazon S3 avec boto?

import boto 

s3 = boto.connect_s3() 
thebucket = s3.get_bucket("bucketname") 
keys = thebucket.list('/old/dir') 
for k in keys: 
    newkeyname = '/new/dir' + k.name.partition('/old/dir')[2] 
    print 'new key name:', newkeyname 
    thebucket.copy_key(newkeyname, k.bucket.name, k.name) 

Pour l'instant il fonctionne, mais est beaucoup plus lent que ce que je peux faire manuellement dans la console managment graphique par simplement copier/coller avec la souris. Très frustrant et il y a beaucoup de clés à copier ...

Connaissez-vous une méthode plus rapide? Merci. Edit: peut-être que je peux le faire avec des processus de copie simultanés. Je ne suis pas vraiment familier avec les méthodes de clés de copie boto et combien de processus simultanés je peux envoyer à amazon. Edit2: j'apprends actuellement le multitraitement Python. Voyons si je peux envoyer 50 opérations de copie simultanément ...

Édition 3: J'ai essayé avec 30 copies simultanées en utilisant le module multitraitement Python. La copie était beaucoup plus rapide que dans la console et moins sujette aux erreurs. Il y a un nouveau problème avec les gros fichiers (> 5Go): boto lève une exception. J'ai besoin de déboguer ceci avant de poster le script mis à jour.

+0

Avez-vous essayé REST-copier un objet (http://docs.amazonwebservices.com/AmazonS3/latest/API/ RESTObjectCOPY.html? R = 7426)? Je voudrais essayer, peut-être que c'est plus rapide ... – Viccari

+0

J'espère que boto appelle déjà cette API, mais je n'ai pas vérifié – ascobol

+1

Donc, je le fais :) Mais j'ai appris à la dure que ça ne blesse pas ... – Viccari

Répondre

1

En ce qui concerne votre problème avec les fichiers de plus de 5 Go: S3 ne supporte pas le téléchargement de fichiers de plus de 5 Go en utilisant la méthode PUT, ce que boto essaie de faire (see boto source, Amazon S3 documentation). Malheureusement, je ne sais pas comment vous pouvez contourner cela, à part le télécharger et le télécharger de nouveau dans un téléchargement en plusieurs parties. Je ne pense pas que boto supporte encore une opération de copie en plusieurs parties (si une telle chose existe même)

Questions connexes