утечка памяти при использовании aws / s3 gem для AWS :: S3 :: Logging :: Log - PullRequest
0 голосов
/ 30 ноября 2010

У меня есть скрипт ruby, который обрабатывает логи S3 примерно так:

AWS::S3::Bucket.find(data_bucket).logs.each do |s3log|
  s3log.lines.each do |line|
    # accumulate stuff
  end
end

Однако в гем aws / s3 аксессор: lines запоминает данные. Так что память растет, когда я обрабатываю каждый файл.

Кроме того, как взламывать драгоценный камень, закрывать файлы, читаемые при каждом запуске, и / или часто запускать скрипт, как я могу изящно избежать рубинового процесса, который может вырасти до нескольких ГБ? Мне не хватает трюка с управлением памятью?

1 Ответ

0 голосов
/ 01 декабря 2010

Корень этого действительно Bucket.objects, который Bucket.logs использует, и который сохраняет ссылки на все объекты в @object_cache. Кэширование строк является дополнительной проблемой.

Решение: я просто использую два цикла: внутренний извлекает журналы с S3 10 за один раз, а внешний обрабатывает, пока is_truncated не станет ложным. Это означает, что мы никогда не храним ссылки на более чем 10 S3 файлов журнала одновременно, и моя проблема с памятью исчезла.

...