我目前正在开发一个rails应用程序,它试图在s3中将视频从一个存储桶复制/移动到另一个存储桶。但是我在rails应用程序上不断收到代理错误502。在mongrel日志中,它说“未能分配内存”。一旦发生此错误,应用程序就会死亡,我们必须重启。
答案 0 :(得分:6)
好像你的代码正在将整个资源读入内存,并且这些代码正在记忆你的应用程序。一种天真的方式(从您的描述中,您已经做过类似的事情)将下载文件并再次上传:只需将其下载到本地文件而不是内存。但是,亚马逊工程师也提前考虑并提供可以处理这种特定情况的API。
如果您正在使用类似RightAWS gem的东西,您可以像这样使用它的S3Interface:
# With s3 being an S3 object acquired via S3Interface.new
# Copies key1 from bucket b1 to key1_copy in bucket b2:
s3.copy('b1', 'key1', 'b2', 'key1_copy')
如果您正在使用裸S3 HTTP接口,请参阅amazon's object copy docs以获取仅使用HTTP将一个对象从一个存储桶复制到另一个存储桶的解决方案。
答案 1 :(得分:0)
尝试流式传输文件,而不是将整个文件加载到内存中,然后再使用它。
例如,如果您使用的是aws-s3 gem,请不要使用:
data = open(file)
S3Object.store file_name, data, BUCKET
请改用以下代码:
S3Object.store file_name, open(file), BUCKET
不确定如何“流式下载”该文件。
答案 2 :(得分:0)
boto效果很好。见this thread。使用boto,您可以将对象直接从一个存储桶复制到另一个存储桶,而不是将它们下载到本地计算机,然后将它们上传到另一个存储桶。
答案 3 :(得分:0)
您可以使用fog gem直接将存储桶复制到存储桶。
s3 = Fog::Storage.new(your_aws_credentials)
s3.copy_object('source-bucket', 'source/path', 'dest-bucket', 'dest/path')