oct*_*tag 7 python amazon-s3 amazon-web-services aws-lambda
我在 S3 上有一个大约 3 亿行的文本文件。我希望将此文件拆分为每个 1,000 行的较小文件(最后一个文件包含其余部分),然后我想将其放入 S3 上的另一个文件夹或存储桶中。
到目前为止,我一直在使用 linux 命令在本地驱动器上运行它:
split -l 1000 file
Run Code Online (Sandbox Code Playgroud)
它将原始文件拆分为 1,000 行的较小文件。但是,对于这样的较大文件,下载然后从本地驱动器重新上传到 S3 似乎效率低下。
拆分此 S3 文件的最有效方法是什么,最好使用 Python(在 Lambda 函数中)或使用其他 S3 命令?在我的本地驱动器上运行它会更快吗?
gue*_*est 13
您所做的任何事情都必须下载文件、拆分文件并重新上传。唯一的问题是在何处,以及是否涉及本地磁盘。
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/
Run Code Online (Sandbox Code Playgroud)
同样,这需要一个 EC2 实例来运行它,以及输出文件的存储空间。但是,有一个标志split可以让您为拆分中的每个文件运行一个 shell 命令:
aws s3 cp s3://src-bucket/src-file - | split -b 1000 --filter 'aws s3 cp - s3://dst-bucket/result.$FILE' -
Run Code Online (Sandbox Code Playgroud)
所以现在您已经消除了本地存储的问题,但剩下的问题是在哪里运行它。我的建议是AWS Batch,它可以仅在执行命令所需的时间内启动 EC2 实例。
当然,您可以编写一个 Python 脚本在 Lambda 上执行此操作,这样做的好处是可以在源文件上传到 S3 时自动触发。我对 Python SDK (boto) 不太熟悉,但似乎get_object将原始文件的主体作为字节流返回,然后您可以将其作为行进行迭代,将您想要的行数累积到每个输出文件中.
| 归档时间: |
|
| 查看次数: |
9754 次 |
| 最近记录: |