2010-09-15 6 views
0

Hey les gars, dans le code suivant:utilisation de la mémoire Ruby/Rails

def process(batch_size=1000) 
    claim_numbers.each_slice(batch_size) do |numbers_batch| 
     claims = Claim.find(:all, :conditions => ["claim_number in (?)", numbers_batch]) 
     # do something with claims 
    end 
    end 

Dans l'un de mes modèles Rails Je traitement beaucoup de claim_numbers, je simuler une méthode find_in_batches afin de ne pas charger beaucoup d'enregistrements en mémoire, alors ma question est: en termes de mémoire, que se passe-t-il avec la variable claims dans chaque itération? Quand le GC du Ruby libère-t-il cette partie de la mémoire?

Toute aide et conseils seraient appréciés, merci d'avance!

Mise à jour: utilisant Ruby 1.8.7-p72

Répondre

1

Ruby libérera la mémoire dès que les pistes de GC. Étant donné que les revendications sont définies dans le bloc each_slice, la revendication n'aura aucune référence en dehors du bloc et lorsque la revendication est réaffectée (en raison d'une itération suivante), les objets attribués précédemment deviennent non référencés. La mémoire de chaque objet est conservée jusqu'à ce que le CPG entre en jeu. La fréquence d'exécution du CPG peut être spécifiée avec certaines variables d'environnement (plus d'informations sur http://blog.evanweaver.com/articles/2009/04/09/ruby-gc-tuning/).

Si, pour une raison quelconque, vous conservez les objets (car il y a toujours une référence, par exemple si vous placez les objets dans un tableau ou un hachage), la mémoire de cet objet n'est pas libérée. Si vous surveillez votre application, vous pouvez constater une augmentation de l'utilisation de la mémoire, mais aussi une augmentation de l'utilisation du processeur, car le GC de ruby ​​est non générationnel, ce qui signifie qu'il vérifie tous les objets.

+0

Merci! Je dois vérifier ce blog! Quelles techniques/outils utilisez-vous pour surveiller votre application? – jpemberthy

+0

Nous sommes passés à JRuby il y a quelques temps et cela nous permet maintenant d'utiliser de jolis outils de monitoring Java (comme JConsole et VisualGC). Le passage à JRuby nous a également permis de mieux ajuster les paramètres du GC. – xinit