A l'aide: Stack level too deep


#1

Bonjour à tous,

j’ai un site qui tourne sous rails et j’ai une table avec plus de 200000
enregistrements.
J’ai besoin de retraiter ces 200000 enregistrements un par un, mùais qd
je lance ce traitement, seuls les 10000 premiers (environ) passent avant
que ne me soit retourné le message d’erreur suivant:
SystemStackError in GamesController#recalc_player_id

stack level too deep

qq à une idee ?

merci d’avance


#2

Hello,

qq à une idee ?

peux-tu nous montrer le code qui réalise l’opération (au moins la
partie itération ?)

– Thibaut


#3

2009/4/19 Hlp H. removed_email_address@domain.invalid

J’ai besoin de retraiter ces 200000 enregistrements un par un, mùais qd
je lance ce traitement, seuls les 10000 premiers (environ) passent avant
que ne me soit retourné le message d’erreur suivant:
SystemStackError in GamesController#recalc_player_id

stack level too deep

Erk!

Ca sent l’appel récursif un brin raté :slight_smile:

Examine bien ton code: quelque chose me dit que tu ne sors pas de ta
fonction de traitement avant de passer au traitement de l’enregistrement
suivant. Résultat: tu fais sauter ton heap (trop d’appels sur la pile).

Analyse bien ta stack trace, elle va te donner la réponse elle-même :slight_smile:


#4

Salut,

voici le code incriminé

Game.find(:all).each do |r|
  r.player_id = Player.find_by_id2(r.p1).id
  r.save
end

merci bcp

Thibaut Barrère wrote:

Hello,

qq � une idee ?

peux-tu nous montrer le code qui r�alise l’op�ration (au moins la
partie it�ration ?)

– Thibaut


#5

r.save

Tu n’aurais pas qqchose qui se mord la queue à partir d’une callback
before_save ou after_save ?


IciMarché fédère l’e-commerce de proximité
http://icimarche.fr


#6

Hello,

Game.find(:all).each do |r|
  r.player_id = Player.find_by_id2(r.p1).id
  r.save
end

Si tu as 200000 enregistrements, find(:all) va avoir du mal.

Essaie d’utiliser ça à la place:
http://guides.rubyonrails.org/active_record_querying.html#find-each

– Thibaut