Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

151
Views
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
about 4 years ago · Santiago Trujillo
1 answers
Answer question

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)
about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!