python - 使用 boto3 的 StreamingBody.iter_lines() 迭代 S3 中的文件是否算作每行的 GET 请求?

标签 python amazon-s3 boto3

我正在做一些事情,我试图通过 boto3 访问存储在 S3 中的大型 CSV 文件中的一些数据。为了便于内存,我正在考虑逐行迭代数据,使用:

s3_client = boto3.client("s3")
iterator = s3_client.get_object(Bucket='my-bucket', Key='my-key')['Body'].iter_lines()

for line in iterator:
    foo(line)

这适用于我一直在测试的玩具数据,但完整数据集超过 7000 万行。我的问题是,使用此方法迭代数据是否实际上会发送 7000 万个单独的请求(并且 AWS 每 7000 万次产生的费用比我一次读取整个文件多出 7000 万次)?或者它算作单个请求吗?

我对 boto3 用于访问 StreamingBody 类中的数据的底层机制不太了解,并且很难找到有关它的信息,包括 boto3 文档中的信息。

最佳答案

不,它为每个请求加载固定的 block 大小(以字节为单位),如果加载的内容缓存中还有另一行,则对生成器的 __next__ 调用将返回它,否则,它将返回再次发出请求,直到没有剩余内容。请参阅https://github.com/boto/botocore/blob/dfda41c08e3ed5354dce9f958b6db06e6cce99ed/botocore/response.py#L135-L148

因此,它发出的请求数量取决于文件大小和 block 大小,与每行的大小无关,它应该适合您的情况。

关于python - 使用 boto3 的 StreamingBody.iter_lines() 迭代 S3 中的文件是否算作每行的 GET 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60422708/

相关文章:

python - 带有 Click 库的 Python 3.6 中没有模块错误

python - 请求 SSL : CERTIFICATE_VERIFY_FAILED with verify ="./cabundle.crt"

python - Scrapy 如何从多个页面抓取项目?

javascript - 将文件上传到 AWS S3 时获取未定义的文件名、文件类型

python - 使用boto3下载Lambda函数的部署包

python - Ruby 将生态系统打包为 Python 术语

java - 从 Linux 上的 Lotus Domino 服务器上的 Java servlet 加载 AWS 凭证

amazon-s3 - Amazon S3 创建对象错误 : POST requires exactly one file upload per request

python - 使用 Boto3 批量删除 Cloudwatch 日志组 - delete_log_group

python - 是否可以在不使用 boto3 下载的情况下获取 S3 文件的内容?