Amazon S3 - 分段上传vs分割文件 - 然后上传

时间:2018-04-06 15:02:58

标签: python amazon-s3 parallel-processing boto boto3

我目前正在尝试使用python将文件从本地上传到S3。我有非常大的文件(超过10 GB),当我通过一些最佳实践来加快上传时,我遇到了分段上传。如果我理解正确,分段上传会做以下事情:

  1. 将文件拆分为多个块。
  2. 将这些块中的每一个上传到S3(根据我们的代码串行或并行)。
  3. 一旦上传了每个块,S3就会将各个块最终组装成一个最终的对象/文件。
  4. 因为,在所有块的上传结束之后,很明显多部分上传将所有内容组装成单个对象。但是,我希望保持各个部分不变,或者找到另一种方法来分割文件并使用python boto的put_object方法上传。这是因为,我希望从S3并行读取文件的各个块/部分以供我进一步处理。有没有办法做到这一点,或者我应该坚持自己拆分文件并将其并行上传(以便更快上传)的传统方式。

    提前致谢。

1 个答案:

答案 0 :(得分:3)

我们遇到了同样的问题,这就是我们采取的方法。

  

启用传输加速

到你的水桶。

https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html

如果您的上传带宽有限,则拆分文件毫无意义。

如果您拥有巨大的上传带宽且单个加速端点没有消耗整个上传带宽,您可以拆分文件并使用multipart上传它们。

使用多部分上传单个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

希望它有所帮助。

<强> EDIT1

从S3部分阅读:

使用S3,您不需要阅读完整的对象。您可以指定对象的起始范围和结束范围。您不需要在S3中维护拆分。您可以维护为单个对象。下面的命令将帮助您部分阅读。

另一个好处是,你也可以平行阅读它们。

  

aws s3api get-object --bucket my_bucket --key object / location / file.txt      file1.range-1000-2000.txt --range bytes = 1000-2000