gpt4 book ai didi

ruby - 如何让 Zlib 从 Ruby 中的 S3 流解压缩?

转载 作者:数据小太阳 更新时间:2023-10-29 07:30:11 29 4
gpt4 key购买 nike

Ruby Zlib::GzipReader 应该通过一个类似 IO 的对象来创建(必须有一个与 IO#read 行为相同的读取方法)。

我的问题是我无法从 AWS::S3 库中获取这个类似 IO 的对象。据我所知,从中获取流的唯一方法是将 block 传递给 S3Object#stream

我已经试过了:

Zlib::GzipReader.new(AWS::S3::S3Object.stream('file', 'bucket'))
# Wich gaves me error: undefined method `read' for #<AWS::S3::S3Object::Value:0x000000017cbe78>

有人知道我怎样才能实现吗?

最佳答案

一个简单的解决方案是将下载的数据写入 StringIO ,然后读回:

require 'stringio'

io = StringIO.new
io.write AWS::S3::S3Object.value('file', 'bucket')
io.rewind

gz = Zlib::GzipReader.new(io)
data = gz.read
gz.close

# do something with data ...

一种更复杂的方法是在流仍在下载时开始膨胀 gzip 数据,这可以通过 IO.pipe 实现。类似这样的事情:

reader, writer = IO.pipe

fork do
reader.close
AWS::S3::S3Object.stream('file', 'bucket') do |chunk|
writer.write chunk
end
end

writer.close

gz = Zlib::GzipReader.new(reader)
while line = gz.gets
# do something with line ...
end

gz.close

你也可以使用Thread代替fork:

reader, writer = IO.pipe

thread = Thread.new do
AWS::S3::S3Object.stream('file', 'bucket') do |chunk|
writer.write chunk
end
writer.close
end

gz = Zlib::GzipReader.new(reader)
while line = gz.gets
# do something with line
end

gz.close
thread.join

关于ruby - 如何让 Zlib 从 Ruby 中的 S3 流解压缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24016548/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com