Ich habe eine große lokale Datei. Ich möchte eine gezippte Version dieser Datei mit der boto
-Bibliothek in S3 hochladen. Die Datei ist zu groß, um sie vor dem Hochladen effizient auf der Festplatte zu speichern. Daher sollte sie während des Uploads gezippt werden. Die Bibliothek boto
kennt eine Funktion set_contents_from_file()
, die ein dateiähnliches Objekt erwartet, von dem sie gelesen wird.Wie gzip beim Hochladen in s3 mit Boto
Die Bibliothek gzip
kennt die Klasse GzipFile
, die über den Parameter fileobj
ein Objekt erhalten kann; Es wird beim Komprimieren in dieses Objekt schreiben.
Ich möchte diese beiden Funktionen kombinieren, aber die eine API möchte selbst lesen, die andere API möchte selbst schreiben; keiner kennt eine passive Operation (wie geschrieben oder gelesen wird).
Hat jemand eine Idee, wie man diese funktionell kombiniert?
EDIT: Ich akzeptierte eine Antwort (siehe unten), weil es mich anzeigte, wohin ich gehen sollte, aber wenn Sie das gleiche Problem haben, finden Sie vielleicht meine eigene Antwort (auch unten) hilfreicher, weil ich eine Lösung mit implementiert habe mehrteilige Uploads darin.
Wird das S3-Upload wirklich brauchen, um die Größe des Wertes wissen? Das würde wirklich bedeuten, dass keine Streaming-Kompression während des Speicherns durchgeführt werden könnte. Ich werde nachsehen. – Alfe
Es gibt einen 'set_contents_from_stream()' in den boto-s3-bucket-keys. Das zumindest deutet darauf hin, dass Streaming möglich sein sollte, meinst du nicht? – Alfe
Aus seiner Dokumentation: 'Das Stream-Objekt ist nicht suchbar und die Gesamtgröße ist nicht bekannt. Dies hat die Implikation, dass wir die Content-Size und Content-MD5 in der Kopfzeile nicht angeben können. Für große Uploads wird die Verzögerung bei der Berechnung von MD5 vermieden, aber mit einer Strafe der Unfähigkeit, die Integrität der hochgeladenen Daten zu verifizieren. – Alfe