Ruby:流式传输大型AWS S3对象冻结

时间:2010-03-31 19:26:07

标签: ruby amazon-s3

我使用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

2 个答案:

答案 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