Rails(というかRuby)で少しハマった話

とあるRailsのコードがえらく遅く,OSが不安定になるので,プロファイルをかけてみたところ下記の1行のコードが原因であることがわかった.

 unit[@ar_object.id] = some_array


悩むこと10分.やっとわかった.


分かった人はわかったと思いますが,答えはCMのあと!


...
...
...
...
...
...
...
...
...
...

もまってられないので,タネあかしをすると上記変数「unit」はHashではなくArrayで
@ar_object.idが30万くらいのFixnumを返していたのが原因でした.



蛇足ながら解説すると「unit」は配列のため,上記1行を実行した時点で30万個の
要素をもつ配列ができてしまい,メモリ不足でOSが不安定になったというオチでした.
またrubyでは配列要素とHash要素のアクセサはともに「[]」なわけですが,fixnumで
アクセスしようとしていたため,機能としては正しく動いていたようです.


JavaScriptなどだとこれで遅くなることはないようですが,Rubyは律義に配列領域を
確保するんですね.気をつけましょう.


(おしまい)