我使用ruby aws / s3库从Amazon S3检索文件。我根据文档流式传输一个对象并将其写入文件(每100个块调试一次以确认进度)
这适用于小文件,但随机冻结在VPS Ubuntu上下载大型(150MB)文件。
可以在速度慢得多的连接上从我的mac中获取相同的文件(150MB)当它挂起时,没有抛出错误,调试输出的最后一行是'Finished chunk'。我已经看到它在冻结之前写了100到10,000个块。
任何人都会遇到这个问题,或者对原因可能有什么想法?
由于
挂起的代码:
i=1
open(local_file, 'w') do |f|
AWS::S3::S3Object.value(key, @s3_bucket) do |chunk|
puts("Writing chunk #{i}")
f.write chunk.read_body
puts("Finished chunk #{i}")
i=i+1
end
end
答案 0 :(得分:1)
我有类似的代码拉动S3对象并写入本地 文件。发现红宝石中的东西正在泄漏记忆。 在另一个窗口中观看“顶部”,居民大小就是这样 起来。它在某些时候冻结,似乎挂了一分钟 或者更多。然后它被Linux OOM杀手杀死了。检查dmesg outout所以看看你的进程是否被OOM杀手杀死了。您 可能会看到那里的一条线
内存不足:已杀死进程12345(红宝石)。
我无法确定为什么这会泄漏内存。我的代码 与你的完全不同,但非常相似。
答案 1 :(得分:1)
尝试使用right_aws gem。它会自动重试。
s3 = RightAws::S3Interface.new(@access_key_id, @secret_access_key)
open(local_file, 'wb') do |f|
s3.get(@my_bucket, file_path) do |chunk|
f.write(chunk)
end
end