我们通过Ruby AWS SDK(v2)从Windows机器上传各种文件到S3.我们已经使用Ruby 1.9进行了测试.我们的代码工作正常,除非遇到大文件,抛出内存不足错误.
起初我们使用以下代码将整个文件读入内存:
:body => IO.binread(filepath),
Run Code Online (Sandbox Code Playgroud)
然后在Googling之后我们发现有很多方法可以用Ruby读取文件:
:body => File.open(filepath, 'rb') { |io| io.read },
Run Code Online (Sandbox Code Playgroud)
但是,此代码无法解决问题,我们无法找到特定的S3(或相关)示例,该示例显示了如何读取文件并以块的形式传递给S3.整个文件仍然加载到内存中,并在大文件中引发内存不足错误.
我们知道我们可以将文件分成块并使用AWS多部分上传上传到S3,但是如果可能的话,首选是避免这种情况(尽管这是唯一的方法).
我们的代码示例如下.以块的形式读取文件,避免内存不足错误以及上传到S3的最佳方法是什么?
require 'aws-sdk'
filepath = 'c:\path\to\some\large\file.big'
bucket = 's3-bucket-name'
s3key = 'some/s3/key/file.big'
accesskeyid = 'ACCESSKEYID'
accesskey = 'ACCESSKEYHERE'
region = 'aws-region-here'
s3 = Aws::S3::Client.new(
:access_key_id => accesskeyid,
:secret_access_key => accesskey,
:region => region
)
resp = s3.put_object(
:bucket => bucket,
:key => s3key,
:body => File.open(filepath, 'rb') { |io| io.read },
)
Run Code Online (Sandbox Code Playgroud)
请注意,我们没有达到S3 5GB的限制,例如1.5GB的文件会发生这种情况.