2010-03-31 60 views
1

我正在使用ruby aws/s3库从Amazon S3中检索文件。我按照文档流式传输一个对象并将其写入文件(每100个块调试一次以确认进度)Ruby:流式传输大型AWS S3对象冻结

这适用于小文件,但随机冻结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 

回答

1

我有类似的代码拉动S3对象并写入本地 文件。已经发现Ruby中的某些内容正在泄漏内存。 在另一个窗口中观看“顶部”时,常驻尺寸仅为 。它在某个时候冻结,似乎挂了一分钟或更长时间 。然后它被Linux OOM杀手杀死。查看dmesg 输出结果,看看你的进程是否被OOM杀手杀死。你 可能会看到一行像

内存不足:杀死进程12345(红宝石)。

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

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