2010-03-31 63 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