Ruby 的 AWS 开发工具包是否在存储桶枚举期间下载 S3 对象?
Does the AWS SDK for Ruby download S3 objects during bucket enumeration?
当使用 Amazon Ruby SDK for S3 时,我需要枚举一个巨大的存储桶中的所有文件以识别任何空文件,即 obj.content_length == 0
我写了一个脚本来做到这一点:
bucket.objects.each() do |obj|
total_objs += 1
if obj.content_length == 0 then
empty_files += 1
puts obj.key
end
end
...但我担心这会导致下载每个文件以确定文件大小。 SDK 是否实际下载文件以了解大小,或者它只是被拉取的元数据,然后如果调用适当的方法则延迟下载对象?
此外,是否有更有效的方法来实现我想要做的事情?
获得所需内容的最简单方法是使用 v2 AWS SDK for Ruby,可用形式为 aws-sdk-core
:
require 'aws-sdk-core'
empty_files = 0
s3 = Aws::S3::Client.new
s3.list_objects(bucket:'aws-sdk').each do |resp|
resp.contents.each do |obj|
if obj.content_length == 0
empty_files += 1
puts obj.key
end
end
end
上面的代码每 1k 个对象准确地发出 1 个请求(仅 S3 returns 每个响应的 1k 个对象的信息)。它使用 SDK 内置的客户端响应分页功能来确保您一直调用 #list_objects 直到用完存储桶。这不会下载对象主体,您可以调用 Aws::S3::Client#get_object
来执行此操作。
更新:
v2 SDK 现在通过面向资源的接口支持这一点。上面相同的代码示例使用 aws-sdk-resources
:
require 'aws-sdk' # must be v2 sdk
empty_files = 0
s3 = Aws::S3::Resource.new
s3.bucket('aws-sdk').objects.each do |obj|
if obj.size == 0
empty_files += 1
puts obj.key
end
end
当使用 Amazon Ruby SDK for S3 时,我需要枚举一个巨大的存储桶中的所有文件以识别任何空文件,即 obj.content_length == 0
我写了一个脚本来做到这一点:
bucket.objects.each() do |obj|
total_objs += 1
if obj.content_length == 0 then
empty_files += 1
puts obj.key
end
end
...但我担心这会导致下载每个文件以确定文件大小。 SDK 是否实际下载文件以了解大小,或者它只是被拉取的元数据,然后如果调用适当的方法则延迟下载对象?
此外,是否有更有效的方法来实现我想要做的事情?
获得所需内容的最简单方法是使用 v2 AWS SDK for Ruby,可用形式为 aws-sdk-core
:
require 'aws-sdk-core'
empty_files = 0
s3 = Aws::S3::Client.new
s3.list_objects(bucket:'aws-sdk').each do |resp|
resp.contents.each do |obj|
if obj.content_length == 0
empty_files += 1
puts obj.key
end
end
end
上面的代码每 1k 个对象准确地发出 1 个请求(仅 S3 returns 每个响应的 1k 个对象的信息)。它使用 SDK 内置的客户端响应分页功能来确保您一直调用 #list_objects 直到用完存储桶。这不会下载对象主体,您可以调用 Aws::S3::Client#get_object
来执行此操作。
更新:
v2 SDK 现在通过面向资源的接口支持这一点。上面相同的代码示例使用 aws-sdk-resources
:
require 'aws-sdk' # must be v2 sdk
empty_files = 0
s3 = Aws::S3::Resource.new
s3.bucket('aws-sdk').objects.each do |obj|
if obj.size == 0
empty_files += 1
puts obj.key
end
end