Ruby: потоковая передача большого объекта AWS S3 зависает

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

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

Когда он зависает, ошибка не возникает, а последней строкой отладочного вывода является «Готовый фрагмент». Я видел, как он записывает от 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

person Peter    schedule 31.03.2010    source источник


Ответы (2)


У меня есть аналогичный код, извлекающий объекты S3 и записывающий в локальные файлы. Обнаружил, что что-то в рубине дает утечку памяти. Наблюдая за «верхом» в другом окне, размер резидента просто увеличивается и увеличивается. В какой-то момент зависает, кажется, зависает на минуту или больше. Затем его убивает убийца linux OOM. Проверьте dmesg outout, чтобы убедиться, что ваш процесс не убивает OOM killer. Вы можете увидеть там строку вроде

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

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

person mobileAgent    schedule 12.06.2010

Вместо этого попробуйте использовать гем 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
person Foo L    schedule 21.06.2012