2009-04-20 3 views
3

현재 s3에서 비디오를 하나의 버킷에서 다른 버킷으로 복사/이동하려고하는 레일 애플리케이션을 개발 중입니다. 그러나 난 내 레일 응용 프로그램에서 프록시 오류 502 계속. mongrel 로그에 "메모리를 할당하지 못했습니다."라고 표시됩니다. 이 오류가 발생하면 응용 프로그램이 종료되고 다시 시작해야합니다.레일 애플리케이션에서 s3을 사용하여 버킷간에 파일을 복사하려면 어떻게해야합니까?

답변

6

코드가 전체 리소스를 메모리로 읽는 것과 같고, 메모리 부족으로 인해 응용 프로그램이 읽히는 것 같습니다. 이것을하기위한 순진한 방법 (그리고 당신의 설명에서 이미 이와 같은 일을하고있는 것)은 파일을 다운로드하고 다시 업로드하는 것입니다. 메모리에 다운로드하지 말고 로컬 파일로 다운로드하십시오. 그러나 아마존 엔지니어는이 특정 사례를 처리 할 수있는 API를 제공하고 있습니다.

# 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를 참조하십시오

당신이 RightAWS 보석 같은 것을 사용하는 경우, 당신과 같이 그 S3Interface을 사용할 수 있습니다 하나의 물체에서 다른 물통으로 한 객체를 복사하는 HTTP입니다.

+0

s3.copy (...)에 인수를 전달하여 새 파일의 사용 권한을 지정할 수 있습니까? – deb

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') 
관련 문제