Forum: Rails France A l'aide: Stack level too deep

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.
Hlp H. (Guest)
on 2009-04-19 16:21
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
Thibaut B. (Guest)
on 2009-04-19 18:35
(Received via mailing list)
Hello,

> qq à une idee ?

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

-- Thibaut
ook? ook! (Guest)
on 2009-04-19 18:37
(Received via mailing list)
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é :)

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 :)
Hlp H. (Guest)
on 2009-04-19 19:28
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
philippe lachaise (Guest)
on 2009-04-19 21:16
(Received via mailing list)
>> 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
Thibaut B. (Guest)
on 2009-04-20 14:16
(Received via mailing list)
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_queryi...

-- Thibaut
This topic is locked and can not be replied to.