我目前正在尝试使用 python 将文件从本地上传到 S3。我有非常大的文件(超过 10 GB),当我尝试一些更快上传的最佳实践时,我遇到了分段上传。如果我理解正确的话,分段上传会执行以下操作:
- 将文件拆分为多个 block 。
- 将每个 block 上传到 S3(根据我们的代码串行或并行)。
- 每个 block 的上传完成后,S3 就会负责将各个 block 最终组装成单个最终对象/文件。
因为,在所有 block 的上传结束后,很明显,分段上传将所有内容组装成一个对象。但是,我想保持各个部分不变,或者找到另一种方法来分割文件并使用 python boto 的 put_object 方法上传。这是因为,我希望从 S3 并行读取文件的各个 block /部分以进行进一步处理。有没有办法做到这一点,或者我应该坚持自己分割文件并并行上传它们的传统方式(为了更快的上传)。
提前致谢。
最佳答案
我们遇到了同样的问题,这是我们采取的方法。
Enable Transfer Acceleration
到你的桶里。
https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html
如果您的上传带宽有限,则拆分文件就没有意义。
如果您有巨大的上传带宽,并且您的单个加速端点没有消耗整个上传带宽,您可以拆分文件并分段上传。
上传包含多个部分的单个 S3 对象/文件:
以下链接包含详细说明。
https://aws.amazon.com/premiumsupport/knowledge-center/s3-multipart-upload-cli/
创建分段上传:
aws s3api create-multipart-upload --bucket multirecv --key testfile --metadata md5= mvhFZXpr7J5u0ooXDoZ/4Q==
上传文件部分:
aws s3api upload-part --bucket multirecv --key testfile --part-number 1 --body testfile.001 --upload-id sDCDOJiTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk --content-md5 Vuoo2L6aAmjr+4sRXUwf0w==
完成上传:
aws s3api list-parts --bucket multirecv --key testfile --upload-id sDCDOJiTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk
希望有帮助。
编辑1
从 S3 部分读取:
使用 S3,您不需要读取完整的对象。您可以指定对象的开始范围和结束范围。您不需要维护 S3 中的拆分。您可以将其维护为单个对象。以下命令将帮助您部分阅读。
另一个好处是,您也可以并行阅读它们。
aws s3api get-object --bucket my_bucket --key object/location/file.txt file1.range-1000-2000.txt --range bytes=1000-2000
关于python - Amazon S3 - 分段上传与分割文件然后上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49695718/