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