Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

160
Vistas
Boto3 descarga gzip y sube como stream

Usando el módulo boto3 de python, permítanme decirlo nuevamente, usando boto3 , no boto . ¿Cómo puedo descargar un archivo de S3, gzip y volver a cargarlo en S3 sin que el archivo se escriba en el disco?

Estoy tratando de escribir una función AWS lambda que Gzips todo el contenido cargado en S3. El problema es que una función lambda está limitada a 512 MB de espacio en disco y mis cargas podrían superar con creces esto.

Mi suposición es que puede ser posible hacer esto usando transmisiones, ¡cualquier ayuda sería muy apreciada! Gracias.

[ACTUALIZAR]

El siguiente código funciona, más o menos. Cargará los fragmentos en S3 y puedo ver el archivo *.gz resultante. Sin embargo, los encabezados gzip no se agregan correctamente. Abrir el archivo da como resultado en mac Error 32 - Broken Pipe .

Dato interesante, si el tamaño del archivo es menor que CHUNK_SIZE , es decir, solo una iteración, el archivo se carga y no está dañado.

Cualquiera ve algo que estoy haciendo mal?

 CHUNK_SIZE = 10000000 gz_buffer = io.BytesIO() gz_stream = gzip.GzipFile(fileobj=gz_buffer, mode='wb', compresslevel=9) obj = resource.Object(bucket, key) body = obj.get()['Body'] try: while True: data = body.read(CHUNK_SIZE) if data: compressed_bytes = gz_stream.write(data) if compressed_bytes < CHUNK_SIZE: gz_stream.close() cdata = gz_buffer.getvalue()[0:compressed_bytes] # Upload cdata as multipart upload # This is a little helper function that # uses boto3 create_multipart_upload multipart.upload(cdata) else: # Signal to S3 complete multipart upload multipart.complete() break except Exception as e: pass
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Yo haría esto:

 import gzip,io out_buffer = io.BytesIO() f = gzip.open(out_buffer,"wb") obj = resource.Object(bucket, key) body = obj.get()['Body'] while True: read = body.read(500000) print('reading...') if read: # 1.) Stream chunks to gzip f.seek(0) nb_bytes = f.write(read) # 2.) Stream compressed chunks back to S3 cdata = out_buffer.getvalue()[0:nb_bytes] # cdata now holds the compressed chunk of data else: break
  • use io.BytesIO para crear un archivo "falso" en la memoria
  • asigne un identificador gzip en él
  • bucle para leer (su código)
  • busque iniciar el identificador de archivo falso antes de escribir para que no use demasiada memoria (la escritura actual sobrescribe la iteración anterior)
  • escriba los datos leídos en el identificador gzip, anote la cantidad de bytes escritos (varían según los datos, y si es más corto que la iteración anterior, el out_buffer no se reduce, por lo que debemos saber la longitud
  • corte el contenido del búfer usando esta longitud para crear su porción comprimida.

tenga en cuenta que en python 2.x, no puede pasar un objeto de archivo a gzip.open , debe crear un objeto Gzip en su lugar, como este:

 f = gzip.GzipFile("foo.gz","wb",fileobj=out_buffer)
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda