【问题标题】:Ruby: Streaming large AWS S3 object freezesRuby:流式处理大型 AWS S3 对象冻结
【发布时间】:2012-06-22 10:04:24
【问题描述】:

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

【问题讨论】:

    标签: ruby amazon-s3


    【解决方案1】:

    我有类似的代码拉 S3 对象并写入本地 文件。发现红宝石中的某些东西正在泄漏内存。 在另一个窗口中观看“顶部”,驻留大小刚刚好 向上和向上。它在某个时候冻结,似乎挂了一分钟 或者更多。然后它被 linux OOM 杀手杀死。检查 dmesg outout 所以看看你的进程是否被OOM杀手杀死。你 可能会在那里看到一条线

    内存不足:杀死进程 12345 (ruby)。

    我无法确定为什么会泄漏内存。我的代码 与您的不完全一样,但非常相似。

    【讨论】:

      【解决方案2】:

      尝试改用 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
      

      【讨论】:

        猜你喜欢
        • 2012-11-09
        • 2018-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        • 2017-06-27
        • 2020-05-14
        • 2023-03-13
        相关资源
        最近更新 更多