我目前正在开发一个 Rails 应用程序,它试图在 s3 中将视频从一个存储桶复制/移动到另一个存储桶。但是,我的 Rails 应用程序不断收到代理错误 502。在 mongrel 日志中,它显示“未能分配内存”。一旦发生此错误,应用程序就会死掉,我们必须重新启动。
问问题
4382 次
4 回答
7
似乎您的代码正在将整个资源读入内存,并且内存不足您的应用程序。一种天真的方法(根据您的描述,您已经在做类似的事情)是下载文件并再次上传:只需将其下载到本地文件而不是内存中。但是,亚马逊工程师已经提前考虑并提供了可以处理这种特定情况的 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 接口,请参阅亚马逊的对象复制文档,了解仅使用 HTTP 将一个对象从一个存储桶复制到另一个的解决方案。
于 2009-04-20T20:35:00.967 回答
0
尝试流式传输文件,而不是将整个文件加载到内存中然后使用它。
例如,如果您使用的是 aws-s3 gem,请不要使用:
data = open(file)
S3Object.store file_name, data, BUCKET
请改用以下内容:
S3Object.store file_name, open(file), BUCKET
不确定如何确切地“流式下载”文件。
于 2009-04-20T20:36:49.743 回答
0
You can copy bucket to bucket directly using the fog gem.
s3 = Fog::Storage.new(your_aws_credentials)
s3.copy_object('source-bucket', 'source/path', 'dest-bucket', 'dest/path')
于 2017-08-03T02:58:51.163 回答