4

我目前正在开发一个 Rails 应用程序,它试图在 s3 中将视频从一个存储桶复制/移动到另一个存储桶。但是,我的 Rails 应用程序不断收到代理错误 502。在 mongrel 日志中,它显示“未能分配内存”。一旦发生此错误,应用程序就会死掉,我们必须重新启动。

4

4 回答 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

博托效果很好。看到这个线程。使用 boto,您可以将对象直接从一个存储桶复制到另一个存储桶,而不是将它们下载到本地计算机然后将它们上传到另一个存储桶。

于 2012-07-28T04:23:51.987 回答
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 回答