Как мне скопировать файлы между корзинами, используя s3 из приложения rails? - PullRequest
3 голосов
/ 20 апреля 2009

В настоящее время я разрабатываю приложение rails, которое пытается скопировать / переместить видео из одного сегмента в другой в s3. Однако я продолжаю получать ошибку прокси 502 в моем приложении rails. В журнале монгрел написано "не удалось выделить память". Как только эта ошибка возникает, приложение умирает, и мы должны перезапустить это.

Ответы [ 4 ]

6 голосов
/ 21 апреля 2009

Похоже, ваш код считывает весь ресурс в память, и это нехватка памяти вашего приложения. Наивным способом сделать это (и из вашего описания, вы уже делаете что-то подобное) было бы загрузить файл и загрузить его снова: просто загрузить его в локальный файл, а не в память. Тем не менее, инженеры Amazon заранее обдумали и предоставили 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')

А если вы используете открытый HTTP-интерфейс S3, см. документация по копированию объектов amazon для решения, которое использует только HTTP для копирования одного объекта из одной корзины в другую.

0 голосов
/ 03 августа 2017

Вы можете скопировать ведро в ведро напрямую, используя туман драгоценный камень.

s3 = Fog::Storage.new(your_aws_credentials)

s3.copy_object('source-bucket', 'source/path', 'dest-bucket', 'dest/path')
0 голосов
/ 28 июля 2012

boto работает хорошо. См. эту тему . Используя boto, вы копируете объекты прямо из одной корзины в другую, а не загружаете их на локальный компьютер, а затем загружаете их в другую корзину.

0 голосов
/ 21 апреля 2009

попробуйте выполнить потоковую передачу файлов вместо загрузки всего файла в память и последующей работы с ним.

например, если вы используете гем aws-s3, не используйте:

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

Вместо этого используйте следующее:

S3Object.store file_name, open(file), BUCKET

не уверен, как именно "поток-скачать" файл, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...