From: keiju@... (ÀÐÄͷ½¼ù ) Date: 1997-02-18T18:35:22+09:00 Subject: [ruby-list:2168] Re: b64encode.rb けいじゅ@SHLジャパンです. In [ruby-list :02164 ] the message: "[ruby-list:2164] b64encode.rb ", on Feb/18 17:20(JST) sinara@blade.nagaokaut.ac.jp writes: >それから、前から気づいていたのですが、大きなファイルに >対して > >encode = [] > encode << uu[0, len].tr('` -_', 'AA-Za-z0-9+/') > >としているところを > >encode = "" > encode += uu[0, len].tr('` -_', 'AA-Za-z0-9+/') > >とすると、メモリを使いきってスラッシングを始めてしまいます。 > >perl ではそんなことがないのですが、ruby は String#+= の >やり過ぎに弱いのではないでしょうか? String#+= は, 文字列オブジェクトを新たに生成しますので, 昔の文字列オブ ジェクトがGCの対象となりそれがスラッシングの原因になっているような気が します. String#+= の代わりに String#concat を用いられたらいかがでしょうか? こ ちらは元の文字列に直接結合しますので, ゴミオブジェクトの発生はなくなる (少なくなる?)と思います. time b64encode.rb /usr/local/bin/ruby > /dev/null を行なうと: 配列版: 248.9u 0.8s 4:18 96% 0+1872k 2+0io 0pf+0w String#concat版: 251.6u 0.5s 4:26 94% 0+1852k 2+0io 0pf+0w ということで, 配列版とあまり変わらなくなります. ところで, String#+=版を実行すると... うーん... 帰ってこない!! プロセスサイズが 89MB になっても終らない... どうも, 参照の切れた文字列が回収されていないようですね. GCにばぐがある んじゃないですか!? __ ..........................................石塚 圭樹@SHLジャパン(株)... ------------->アドレス変わりました!! e-mail: keiju@shljapan.co.jp <----