繁体   English   中英

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

[英]How do I get Zlib to uncompress from S3 stream in Ruby?

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

我的问题是我无法从AWS::S3 lib获得这个类似IO的对象。 据我所知,从中获取流的唯一方法是将块传递给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 ...

更精细的方法是在流仍在下载时开始膨胀压缩数据,这可以通过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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM