Ho un file locale di grandi dimensioni. Voglio caricare una versione gzip di quel file in S3 usando la libreria boto
. Il file è troppo grande per essere gzip in modo efficiente sul disco prima del caricamento, quindi dovrebbe essere gzip in streaming durante il caricamento.Come gzip durante il caricamento in s3 utilizzando boto
La libreria boto
conosce una funzione set_contents_from_file()
che si aspetta un oggetto simile a un file da cui leggerà.
La libreria gzip
conosce la classe GzipFile
che può ottenere un oggetto tramite il parametro denominato fileobj
; scriverà su questo oggetto durante la compressione.
Mi piacerebbe combinare queste due funzioni, ma l'unica API vuole leggere da sola, l'altra API vuole scrivere da sola; né conosce un'operazione passiva (come essere scritto o letto da).
Qualcuno ha un'idea su come combinarli in modo funzionante? EDIT: Ho accettato una risposta (vedi sotto) perché mi ha suggerito dove andare, ma se hai lo stesso problema, potresti trovare la mia risposta (anche sotto) più utile, perché ho implementato una soluzione usando caricamenti multipart in esso.
Sarà l'upload S3 davvero bisogno di conoscere la dimensione del valore? Ciò significherebbe veramente che non è possibile eseguire alcuna compressione di streaming durante la memorizzazione. Vado a controllare questo. – Alfe
C'è un 'set_contents_from_stream()' nelle chiavi boto-s3-bucket. Che almeno un suggerimento su quello streaming dovrebbe essere possibile, non credi? – Alfe
Dalla sua documentazione: 'L'oggetto flusso non è ricercabile e la dimensione totale non è nota. Ciò implica che non è possibile specificare Content-Size e Content-MD5 nell'intestazione. Pertanto, per gli enormi caricamenti , il ritardo nel calcolo di MD5 viene evitato ma con una penalità di impossibilità di verificare l'integrità dei dati caricati . – Alfe