2010-11-30 6 views
0

J'ai un script Ruby qui traite S3 enregistre quelque chose comme ceci:une fuite de mémoire lors de l'utilisation aws/gem s3 pour AWS :: S3 :: Exploitation forestière :: Log

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

Cependant, le joyau SSFE/s3 l'accesseur: lines mémorise les données. La mémoire grandit alors que je traite chaque fichier. En plus du piratage de la gemme, de l'encapsulation des fichiers lus chaque fois, et/ou de l'exécution fréquente du script, comment puis-je éviter gracieusement un processus ruby ​​qui pourrait atteindre plusieurs gigaoctets? Est-ce que je manque un tour de gestion de la mémoire?

+0

Pour l'instant, je vais exécuter le travail fréquemment, et avec les logs (nom,: max_keys => 100), mais je suis curieux de savoir s'il existe un moyen de libérer les fichiers journaux chargés en mémoire. L'approche: max_keys impose une limite de débit que je dois surveiller. – potatoihave

Répondre

0

La racine de ceci est vraiment Bucket.objects, qui est ce que Bucket.logs utilise, et qui conserve des références tous les objets dans @object_cache. La mise en cache des lignes est un problème secondaire.

Solution: J'utilise simplement deux boucles: l'interne extrait les logs de S3 10 à la fois, et l'externe traite jusqu'à ce que is_truncated soit faux. Cela signifie que nous ne conservons jamais de références à plus de 10 fichiers journaux à la fois, et que mon problème de mémoire a disparu.

Questions connexes