Tôi có một tệp cục bộ lớn. Tôi muốn tải lên phiên bản gzipped của tệp đó vào S3 bằng cách sử dụng thư viện boto
. Tệp quá lớn để gzip hiệu quả trên đĩa trước khi tải lên, vì vậy tệp phải được nén theo cách được truyền trực tuyến trong khi tải lên.Cách tải xuống gzip trong khi tải lên s3 bằng boto
Thư viện boto
biết chức năng set_contents_from_file()
dự kiến một đối tượng giống như tệp sẽ đọc từ đó.
Thư viện gzip
biết lớp học GzipFile
có thể nhận đối tượng thông qua tham số có tên fileobj
; nó sẽ ghi vào đối tượng này khi nén.
Tôi muốn kết hợp hai hàm này, nhưng một API muốn tự đọc, API kia muốn tự viết; không biết một hoạt động thụ động (như được viết hoặc đọc).
Có ai có ý tưởng về cách kết hợp chúng theo cách làm việc không?
EDIT: Tôi đã chấp nhận một câu trả lời (xem bên dưới) vì nó gợi ý tôi đi đâu, nhưng nếu bạn có cùng một vấn đề, bạn có thể tìm thấy câu trả lời của riêng tôi (cũng dưới đây) hữu ích hơn tải lên nhiều phần trong đó.
sẽ tải lên S3 thực sự cần phải biết kích thước của giá trị? Điều đó thực sự có nghĩa là không thể nén trực tuyến trong khi lưu trữ có thể được thực hiện. Tôi sẽ kiểm tra điều này. – Alfe
Có một 'set_contents_from_stream()' trong boto-s3-bucket-keys. Điều đó ít nhất gợi ý về việc phát trực tuyến đó là có thể, bạn có nghĩ vậy không? – Alfe
Từ tài liệu của nó: 'Các đối tượng dòng là không thể tìm kiếm và tổng kích thước không được biết đến. Điều này có ngụ ý rằng chúng tôi không thể chỉ định Kích thước nội dung và Nội dung-MD5 trong tiêu đề. Vì vậy, đối với các bản tải lên lớn , việc chậm trễ tính toán MD5 tránh được nhưng với một hình phạt không có khả năng xác minh tính toàn vẹn của dữ liệu đã tải lên .' – Alfe