我们通过 Ruby AWS SDK (v2) 从 Windows 计算机将各种文件上传到 S3。我们已经使用 Ruby 1.9 进行了测试。我们的代码工作正常,除非遇到大文件,抛出内存不足错误。
首先,我们使用以下代码将整个文件读入内存:
:body => IO.binread(filepath),
然后在谷歌搜索后我们发现有一些方法可以用 Ruby 分块读取文件:
:body => File.open(filepath, 'rb') { |io| io.read },
不过,此代码并没有解决问题,而且我们找不到特定的 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 },
)
请注意,我们没有达到 S3 5GB 限制,例如 1.5GB 的文件就会发生这种情况。