2009-04-20 32 views
3

我目前正在開發一個rails應用程序,它試圖在s3中將視頻從一個存儲桶複製到另一個存儲桶。但是,我不斷收到我的rails應用程序上的代理錯誤502。在雜種日誌中,它表示「未能分配內存」。一旦發生此錯誤,應用程序就會死亡,我們必須重新啓動。如何在導軌應用程序中使用s3在存儲區之間複製文件?

回答

6

好像您的代碼正在將整個資源讀取到內存中,以及您的應用程序無法讀取。一個天真的方式來做到這一點(並從你的描述,你已經做了這樣的事情)將是下載文件並再次上傳它:只需將它下載到本地文件,而不是內存。然而,亞馬遜的工程師們已經提前思考並提供了可以處理這種特定情況的API。

如果你正在使用類似的RightAWS寶石,你可以用它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將一個對象從一個桶複製到另一個桶。

+0

我可以將參數傳遞給s3.copy(...)來指定新文件的權限嗎? – deb 2010-08-12 19:30:52

0

嘗試流文件而不是將整個文件加載到內存中,然後使用它。

例如,如果您正在使用AWS-S3的寶石,不要使用:

data = open(file) 
S3Object.store file_name, data, BUCKET 

使用以下代替:

S3Object.store file_name, open(file), BUCKET 

不知道究竟如何 「流下載的」文件雖然。

0

boto效果很好。見this thread。使用boto,將對象從一個桶直接複製到另一個桶,而不是將它們下載到本地計算機,然後將它們上傳到另一個桶。

0

您可以使用fog寶石直接將存儲桶複製到存儲桶中。

s3 = Fog::Storage.new(your_aws_credentials) 

s3.copy_object('source-bucket', 'source/path', 'dest-bucket', 'dest/path') 
相關問題