Ruby: потоковая передача большого объекта AWS S3 зависает - PullRequest
1 голос
/ 31 марта 2010

Я использую библиотеку ruby ​​aws / s3 для получения файлов из Amazon S3. Я передаю объект в потоковом режиме и записываю его в файл согласно документации (с отладкой каждые 100 блоков для подтверждения прогресса)

Это работает для небольших файлов, но случайным образом останавливает загрузку больших (150 МБ) файлов в VPS Ubuntu. Извлечение тех же файлов (150 МБ) с моего Mac при гораздо более медленном соединении работает просто отлично.

Когда он зависает, ошибка не выдается, а последней строкой отладочного вывода является 'Finished chunk'. Я видел, как пишется от 100 до 10000 кусков перед замораживанием.

Кто-нибудь сталкивался с этим или есть идеи о том, что может быть причиной?

Спасибо

Код, который висит:

  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

Ответы [ 2 ]

1 голос
/ 22 июня 2012

Попробуйте вместо этого использовать гем right_aws. Это делает автоматическую повторную попытку.

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
1 голос
/ 12 июня 2010

У меня похожий код, тянущий объекты S3 и пишущий на локальный файлы. Нашли, что что-то в рубине подтекает память. Смотря "верх" в другом окне, размер резидента просто идет вверх и вверх. В какой-то момент зависает, кажется, на минуту зависает или больше. Тогда это убито убийцей OOM Linux. Проверьте dmesg out out, так что посмотрите, убивает ли ваш процесс убийца OOM. Вы может видеть строку там как

Недостаточно памяти: уничтожен процесс 12345 (ruby).

Я не смог определить, почему это приводит к утечке памяти. Мой код не совсем как у тебя, но очень похоже.

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