从S3流出一行大文件

时间:2017-09-09 03:43:05

标签: ruby heroku amazon-s3 io large-files

我在s3中有几个10gb的csv文件,我想用来播种我的数据库。我正在Heroku上运行一个RoR应用程序而且我无法弄清楚如何逐行流式传输csv以处理它,因为它太大而无法放入内存中而且我可以“#”;使用File.open访问外部文件。

我已经研究过使用Tempfile一次流式传输字节,但是它们不能与新行匹配,并且在Ruby中重构它很困难。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以阅读API,如API文档中所述:http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html

File.open('output', 'wb') do |file|
  large_object.read do |chunk|
    file.write(chunk)
  end
end

您还可以使用range作为选项来读取一系列字节。

http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#read-instance_method

答案 1 :(得分:0)

@David请注意,当使用块下载对象时,Ruby SDK在产生第一批数据后将不会重试失败的请求。这样做可能会从中游开始,从而导致客户端文件损坏。

从Amazon S3下载大型对象时,通常需要将对象直接流式传输到磁盘上的文件中。这样可以避免将整个对象加载到内存中。您可以将任何AWS操作的:target指定为IO对象。

File.open('filename', 'wb') do |file|
 reap = s3.get_object({ bucket:'bucket-name', key:'object-key' }, target: file)
end

Here是官方链接。

答案 2 :(得分:0)

对于Aws::S3 V2:

s3 = Aws::S3::Client.new
File.open('filename', 'wb') do |file|
  s3.get_object(bucket: 'bucket-name', key:'object-key') do |chunk|
    file.write(chunk)
  end
end