我正在做一些事情,我试图通过 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/