编程语言
首页 > 编程语言> > python-将S3文件拆分为1000行的较小文件

python-将S3文件拆分为1000行的较小文件

作者:互联网

我在S3上有一个文本文件,大约有3亿行.我希望将此文件拆分为每个1000行的较小文件(最后一个文件包含其余部分),然后将其放入S3上的另一个文件夹或存储桶中.

到目前为止,我已经使用linux命令在本地驱动器上运行此命令:

split -l 1000 file

将原始文件分割成1000行的较小文件.但是,对于像这样的较大文件,从本地驱动器下载然后重新上传回S3似乎效率很低.

最好使用Python(在Lambda函数中)或使用其他S3命令来分割此S3文件的最有效方法是什么?仅在本地驱动器上运行它会更快吗?

解决方法:

您所做的任何事情都将需要下载文件,分割文件并重新上传.唯一的问题是在哪里以及是否涉及本地磁盘.

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,然后您可以将其迭代为行,但是要在每个输出文件中累积多少行.

标签:amazon-web-services,amazon-s3,aws-lambda,python
来源: https://codeday.me/bug/20191024/1922388.html