2010-03-31 4 views
1

J'utilise la bibliothèque ruby ​​aws/s3 pour récupérer des fichiers d'Amazon S3. Je diffuse un objet et l'écris dans le fichier conformément à la documentation (avec débogage tous les 100 morceaux pour confirmer la progression)Ruby: Le streaming d'un gros objet AWS S3 se bloque

Cela fonctionne pour les petits fichiers, mais gèle aléatoirement le téléchargement de gros fichiers (150MB) sur VPS Ubuntu. Récupérer les mêmes fichiers (150 Mo) de mon mac sur une connexion beaucoup plus lente fonctionne très bien. Lorsqu'il se bloque, aucune erreur n'est levée et la dernière ligne de sortie de débogage est le 'Morceau terminé.' Je l'ai vu écrire entre 100 et 10 000 morceaux avant de geler.

Quelqu'un a-t-il découvert cela ou a-t-il des idées sur la cause?

Merci

Le code qui se bloque:

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 

Répondre

1

J'ai un code similaire tirant des objets S3 et de l'écriture aux fichiers locaux. J'ai trouvé que quelque chose dans le rubis fuit la mémoire. Regarder "top" dans une autre fenêtre, la taille du résident va juste de haut en place. Il gèle à un certain point, semble se bloquer pendant une minute ou plus. Ensuite, il est tué par le tueur Linux OOM. Vérifiez dmesg outout pour voir si votre processus est tué par OOM tueur. Vous peut voir une ligne là comme

Mémoire insuffisante: processus tué 12345 (rubis).

Je n'ai pas été en mesure de déterminer pourquoi cela fuit la mémoire. Mon code n'est pas exactement comme le vôtre mais très similaire.

1

Essayez plutôt d'utiliser right_aws gem. Il réessaye automatiquement.

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 
Questions connexes