首页 > 解决方案 > 将大型 S3 文件拆分为每个文件的行(不是每个文件的字节数)

问题描述

我在 S3 中有一个带有文本行的 8 GB 文件(每行都有一个回车符)。此文件是自定义格式的,不遵循任何常见格式,如 CSV、管道、JSON ...我需要根据行数将该文件拆分为更小的文件,这样每个文件将包含 100,000 行或更少(假设最后一个文件可以包含剩余的行,因此可能少于 100,000 行)。

  1. 我需要一种不是基于文件大小(即字节),而是基于行数的方法。文件不能有一行在两者之间分开。
  2. 我需要使用 Python。
  3. 我需要使用 Lambda、Glue 等无服务器 AWS 服务……我无法启动 EC2 或 EMR 等实例。

到目前为止,我发现很多帖子显示了如何按字节大小而不是按行数进行拆分。另外,我不想逐行读取该文件,因为它太慢且效率不高。

有人可以向我展示一个可以完成拆分这个 6 GB 文件的启动代码或方法,该文件运行速度很快,并且在任何时候都不需要超过 10 GB 的可用内存 (RAM)?

我正在寻找所有可能的选择,只要满足上述基本要求...

非常感谢!

迈克尔

标签: pythonamazon-web-servicesamazon-s3aws-lambdaaws-glue

解决方案


boto3.S3.Client.get_object()方法提供类型的对象StreamingBody作为响应。

StreamingBody.iter_lines()方法文档指出:

返回一个迭代器以从原始流中产生行。

这是通过从原始流中一次读取字节块(大小为 chunk_size),然后从那里产生行来实现的。

这可能适合您的用例。一般的想法是获取巨大的文件流并在其内容到来时对其进行处理。如果不以某种方式读取文件,我想不出办法做到这一点。


推荐阅读