Forum: Rails France JRuby qui prend énormement de mémoire sans la rendre

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
7348964afddee10af83cb6f8198760e5?d=identicon&s=25 Sylvain Desbureaux (sdesbure)
on 2009-03-18 16:14
Bonjour,
j'ai les relations suivantes :

Connections < AR::B
has_many paths

Path < AR::B
belongs_to :connection
has_many :cross_connections

CrossConnection < AR::B
belongs_to :path

j'ai énormément de connections (~3000), de chemins (~14000) et de
cross-connections (~200000).

Pour une action, je dois vérifier les cross-connections selon leur
chemin et donc leur connexion.
Je fais donc

@connections = Connection.find(:all,:conditions => mes_conditions)
@connections.each do |cnx|
   @result[cnx.id] = cnx.find_problems
end

dans le modèle Connection, j'ai la méthode suivante :

def find_problems
   result = Array.new
   paths.each do |path|
      path_id = path.id
      result[path_id] = path.find_problems
    end
    result
end

Enfin, dans le modèle Path, j'ai la méthode suivante :
def find_problems
   xc_main = Array.new
   xc_alt = Array.new
   (0..2).each do |i|
     xc_main[i] = Array.new
     xc_alt[i] = Array.new
   end
   xcs = CrossConnection.find_all_by_path_id(id, :order =>
"path_position ASC")
   xcs.each do |xc|
     if xc.is_on_main
       xc_path_part = xc.path_part
       xc_main[xc_path_part] << xc
     else
       xc_path_part = xc.path_part
       xc_alt[xc_path_part] << xc
     end
    end
    // travail sur ces tableaux, plus précisément sur une valeur de type
Integer de l'objet xc (exemple : modules_alt[1] =
((xc_alt[1][1..-1].collect {|xc| xc.ingress_device_module_id})
   result
end

Je ne passe qu'une seule fois par un objet CrossConnection donné.
Néammoins, lorsque je lance la vérification, ma mémoire n'arrête pas de
grossir et les garbage collector de jruby n'enlève qu'une petite
fraction des objets. Je pense donc que les objets cross connections ne
peuvent être déférencés...
Comment faire pour bien déréférencer ces objets pour être sur que le
garbage collector puisse récupérer la mémoire ?
j'ai l'impression que quand je fais par exemple :
modules_alt[1] = ((xc_alt[1][1..-1].collect {|xc|
xc.ingress_device_module_id}
dans modules_alt, je récupère pas la valeur mais qu'il mappe la valeur
qui est dans xc.ingress_device_module_id, ce qui fair qu'il ne peut
déréférencer l'objet xc. Et comme j'en ai 200 000, ça prend énormément
de place en mémoire...

Vous auriez une idée pour que je puisse gagner en mémoire ?

merci d'avance,

Sylvain
98d4d4be867fc17d3120f683513d3819?d=identicon&s=25 Guillaume Betous (Guest)
on 2009-03-18 16:26
(Received via mailing list)
> Vous auriez une idée pour que je puisse gagner en mémoire ?


Je n'ai fait que survoler ton post, mais comme ton soucis a l'air d'être
au
niveau de l'implémentation Ruby, as-tu essayé avec autre chose que JRuby
?

gUI

--
Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/
7348964afddee10af83cb6f8198760e5?d=identicon&s=25 Sylvain Desbureaux (sdesbure)
on 2009-03-18 17:15
Guillaume Betous wrote:
>> Vous auriez une idée pour que je puisse gagner en mémoire ?
>
>
> Je n'ai fait que survoler ton post, mais comme ton soucis a l'air d'être
> au
> niveau de l'implémentation Ruby, as-tu essayé avec autre chose que JRuby
> ?
>
> gUI
>
> --
> Pour la santé de votre ordinateur, préférez les logiciels libres.
> Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
> Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
> Suite bureautique : http://fr.openoffice.org/

j'ai aussi essayé avec ruby 1.8.7 le problème est le même (mais "moins"
grave car l'appli reste à un niveau inférieur à la mémoire totale)
This topic is locked and can not be replied to.