python - 将大型 S3 文件拆分为每个文件的行(不是每个文件的字节数)
问题描述
我在 S3 中有一个带有文本行的 8 GB 文件(每行都有一个回车符)。此文件是自定义格式的,不遵循任何常见格式,如 CSV、管道、JSON ...我需要根据行数将该文件拆分为更小的文件,这样每个文件将包含 100,000 行或更少(假设最后一个文件可以包含剩余的行,因此可能少于 100,000 行)。
- 我需要一种不是基于文件大小(即字节),而是基于行数的方法。文件不能有一行在两者之间分开。
- 我需要使用 Python。
- 我需要使用 Lambda、Glue 等无服务器 AWS 服务……我无法启动 EC2 或 EMR 等实例。
到目前为止,我发现很多帖子显示了如何按字节大小而不是按行数进行拆分。另外,我不想逐行读取该文件,因为它太慢且效率不高。
有人可以向我展示一个可以完成拆分这个 6 GB 文件的启动代码或方法,该文件运行速度很快,并且在任何时候都不需要超过 10 GB 的可用内存 (RAM)?
我正在寻找所有可能的选择,只要满足上述基本要求...
非常感谢!
迈克尔
解决方案
boto3.S3.Client.get_object()
方法提供类型的对象StreamingBody
作为响应。
StreamingBody.iter_lines()
方法文档指出:
返回一个迭代器以从原始流中产生行。
这是通过从原始流中一次读取字节块(大小为 chunk_size),然后从那里产生行来实现的。
这可能适合您的用例。一般的想法是获取巨大的文件流并在其内容到来时对其进行处理。如果不以某种方式读取文件,我想不出办法做到这一点。
推荐阅读
- apache-kafka - “注册”是 Ksql 中的保留关键字,如果是,我如何选择具有该名称的字段
- javascript - 带有 EasyPieChart 和 Waypoint 的 JS 未执行
- javascript - 按钮属性在单击后恢复正常
- c# - Asp.net MVC Ajax 在 GET HTML 上调用空参数
- django - 错误:重复记录违反了单数约束“user_otherinfo_user_id_key”
- maven - 如何使用较新版本的 Hadoop 构建融合的 kafka hdfs 连接器
- java - Stringbuilder subSequence 方法的时间复杂度
- reporting-services - 在 SSRS 中读取带空格的 URL 参数
- java - 我想将一些数据上传到我的数据库,但该方法返回 null
- html-table - Jaws 不会在 ie 浏览器中读取 html 表之后的等式