S.F. Page

Programming,Music,etc...

東京メトロオープンデータ (9) ガベージコレクタをうまく働かす。

ブログを書いている暇もないほどにプログラミングに勤しんでいるといいたいところだが、無印良品の「人間をダメにするソファー」に体を預けてTVをだらだらと観て眠かったらそれで寝るというのがあまりのも心地よくて、休日は完全に無印ソファー廃人と化している私である。が、まあ以前よりは集中して取り組んでいる。予定より遅れてはいるがなんとか期日までにできそうな気もしてきた。

https://bxkvxg.dm2301.livefilestore.com/y2p1gIinSt3PCgTpodZ8ShTP3ZxspGJcMLYmdWL3OZm_AjSt3qXKyLzVzvNxWeKFdHofci_abxm2EVJrGf4EyzK7pumqdO5Z_uH6W3OZ8nrt8U/110601.png?psid=1

ちなみに上記のエミュレーション画面がiPhone6になっているのは私のiPhone6欲が現れたものと言ってよい。一応iPhone5は持っているのでそれでテストしてみているけどまあまあ動くがちと重い。iPhone6だとサクサク動きそうだがなぁ。。とか思っているとちょっと欲しくなってきた。

ちなみに下は時刻表みたいなものを作ってみてmodalで表示してみているところ。時刻表はもうちょっと完成度を挙げるつもりではある。何をもって完成というのかは私自身もわかっていないが。。

路線データや列車ロケーション情報は自前サーバーでnode.jsで定期的に収集し、アプリの配信データとして保存している。なので常駐するスクリプトとなるのだが、書いてみたところメモリー消費量がちょっと多くて驚いた。60MBを越えてしまう。その程度か!と思われるかもしれないが、私のVPSは貧弱でメモリも最大メモリ1GBなのであるから、これはゆゆしき問題なのである。いろいろ調べるとnodeではgcを手動実行できることがわかったので試してみたがあまり効果はなかった。どうもガベコレが効くということでメモリ管理をまったく考慮せずコードを書いているせいで、メモリがガベコレでうまく解放されず溜まっていっているようである。ガベコレの挙動を意識したコードを書かないといずれこのアプリも破綻してしまいそうだ。ブラウザ側もスマフォで軽快に動かすとなるとメモリ管理を意識せざるを得ないようである。そうなるとC++とかの方がいいんだよねぇ。。まあしょうがないか。。

メモリ消費を抑える方法としては、循環参照を防ぐ、使用しなくなったオブジェクト変数にはnullやvoid(0)を代入する、クロージャの利用を抑える、deleteを使って明示的にオブジェクトを削除するとかいろいろあるようだ。DOMのガベコレは参照カウンタで、JSのガベコレは世代別GCという方式だそうだ。確かに参照カウンタだと循環参照するとアウトですわな。。