2012-02-09 20 views
5

Necesito copiar todas las claves de '/ old/dir /' a '/ new/dir /' en un cubo amazon S3. me ocurrió con este script (corte rápido):Cómo copiar de manera eficiente todos los archivos de un directorio a otro en un cubo S3 de Amazon con 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) 

Por ahora se está trabajando, pero es mucho más lento que lo que pueda hacer de forma manual en la consola de gerencia gráfica con sólo copiar/pasado con el ratón. Muy frustrante y hay muchas claves para copiar ...

¿Conoces algún método más rápido? Gracias.

Edición: tal vez pueda hacer esto con procesos de copia simultáneos. No estoy muy familiarizado con los métodos de copia de boto y cuántos procesos simultáneos puedo enviar a Amazon.

Edit2: actualmente estoy aprendiendo el multiprocesamiento de Python. Veamos si puedo enviar 50 operaciones de copia simultáneamente ...

Edición 3: Probé con 30 copias simultáneas usando el módulo de multiprocesamiento de Python. La copia fue mucho más rápida que dentro de la consola y menos propensa a errores. Hay un problema nuevo con archivos grandes (> 5Gb): boto plantea una excepción. Necesito depurar esto antes de publicar el script actualizado.

+0

¿Has probado REST-copiando un objeto (http://docs.amazonwebservices.com/AmazonS3/latest/API/ RESTObjectCOPY.html? R = 7426)? Lo probaría, tal vez sea más rápido ... – Viccari

+0

Espero que Boto llame a esta API, pero no revisé – ascobol

+1

Entonces sí :) Pero aprendí por las malas que no hace daño ... – Viccari

Respuesta

1

En cuanto a su problema con archivos de más de 5GB: S3 no admite la carga de archivos de más de 5GB utilizando el método PUT, que es lo que boto intenta hacer (see boto source, Amazon S3 documentation).

Desafortunadamente no estoy seguro de cómo puede evitar esto, además de descargarlo y volver a cargarlo en una carga de varias partes. No creo que boto admita una operación de copia de varias partes (si tal cosa existe)

Cuestiones relacionadas