您所做的任何事情都将需要下载文件,分割文件并重新上传.唯一的问题是在哪里以及是否涉及本地磁盘.
John Rotenstein提供了一个在EC2实例上使用本地磁盘的示例.这具有在AWS数据中心中运行的优势,因此它获得了高速连接,但有以下限制:(1)您需要磁盘空间来存储原始文件及其片段,并且(2)您需要一个EC2实例在哪里可以做到这一点.
一个小的优化是通过使用连字符作为s3 cp的目标来避免大文件的本地副本:这会将输出发送到标准输出,然后您可以将其通过管道传递给split(在这里我也在使用用来告诉split从标准输入中读取的连字符):
aws s3 cp s3://my-bucket/big-file.txt - | split -l 1000 - output.
aws s3 cp output.* s3://dest-bucket/
同样,这需要EC2实例在其上运行,并需要输出文件的存储空间.但是,有一个拆分标志,可让您为拆分中的每个文件运行一个shell命令:
aws s3 cp s3://src-bucket/src-file - | split -b 1000 --filter 'aws s3 cp - s3://dst-bucket/result.$FILE' -
因此,现在您已经消除了本地存储的问题,但是只剩下在哪里运行它的问题.我的建议是AWS Batch,它可以在执行命令所需的时间内启动一个EC2实例.
您当然可以在Lambda上编写Python脚本来执行此操作,这将具有在将源文件上传到S3后自动触发的好处.我对Python SDK(boto)不太熟悉,但是看来get_object会将原始文件的主体返回为stream of bytes,然后您可以将其迭代为行,但是要在每个输出文件中累积多少行.