JRuby qui prend énormement de mémoire sans la rendre


#1

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


#2

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/


#3

Guillaume B. 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)