Wie gzip beim Hochladen in s3 mit Boto

7

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 boto -Bibliothek kennt eine Funktion set_contents_from_file() , die ein dateiähnliches Objekt erwartet, aus dem sie liest.

Die Bibliothek gzip kennt die Klasse GzipFile , die ein Objekt über den Parameter fileobj ; 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 auf eine funktionierende Art und Weise kombiniert?

BEARBEITEN: Ich habe eine Antwort akzeptiert (siehe unten), weil sie mich darauf hinwies, wo ich hingehen sollte. Aber wenn Sie das gleiche Problem haben, könnte meine eigene Antwort (auch unten) hilfreicher sein, weil ich eine Lösung mit multipart implementiert habe lädt darin hoch.

    
Alfe 02.04.2013, 01:22
quelle

2 Antworten

3

Es gibt wirklich keine Möglichkeit, dies zu tun, da S3 keine echte Streaming-Eingabe unterstützt (d. h. Chunked-Transfer-Codierung). Sie müssen die Inhaltslänge vor dem Hochladen kennen und wissen nur, dass die gzip-Operation zuerst ausgeführt wurde.

    
garnaat 02.04.2013, 12:14
quelle
18

Ich habe die in den Kommentaren der angenommenen Antwort von garnaat angedeutete Lösung implementiert:

%Vor%

Es scheint ohne Probleme zu funktionieren. Und schließlich ist Streaming in den meisten Fällen nur ein Chunking der Daten. In diesem Fall sind die Chunks etwa 10 MB groß, aber wen interessiert das schon? Solange wir nicht über mehrere GB-Chunks sprechen, geht es mir gut.

Update für Python 3:

%Vor%     
Alfe 03.04.2013 23:17
quelle

Tags und Links