我在s3中有几个10gb的csv文件,我想用来播种我的数据库。我正在Heroku上运行一个RoR应用程序而且我无法弄清楚如何逐行流式传输csv以处理它,因为它太大而无法放入内存中而且我可以“#”;使用File.open访问外部文件。
我已经研究过使用Tempfile一次流式传输字节,但是它们不能与新行匹配,并且在Ruby中重构它很困难。
谢谢!
答案 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