From: Tanaka Akira Date: 2012-05-17T18:21:16+09:00 Subject: [ruby-dev:45644] Re: [ruby-trunk - Feature #6440][Open] 引数にIOを渡した場合のMarshal.loadにバッファを持たせたい 2012/5/16 Glass_saga (Masaki Matsushita) : > > Issue #6440 has been reported by Glass_saga (Masaki Matsushita). > > ---------------------------------------- > Feature #6440: 引数にIOを渡した場合のMarshal.loadにバッファを持たせたい > https://bugs.ruby-lang.org/issues/6440 > 現在のMarshal.loadでは、引数にIOを渡すとIO#getbyteやIO#readで当座に必要な部分のみの読み出しを繰り返すので > 大量のメソッド呼び出しが発生し、そのコストが無視できません。 > そこで、引数にIOを渡した場合のMarshal.loadにバッファを持たせる事を提案します。 バッファがあると、読みすぎることがあるのではないでしょうか。 読みすぎたぶんを捨ててしまうと、 marshal したデータが複数並んでいるものを読み込む場合に、 動作しなくなってしまうと思います。 実際、パッチを当てると以下のようにエラーになってしまいます。 % ./ruby -e '2.times { Marshal.dump(1, STDOUT) }'| ./ruby -e '2.times { p Marshal.load(STDIN) }' 1 -e:1:in `readpartial': end of file reached (EOFError) from -e:1:in `load' from -e:1:in `block in
' from -e:1:in `times' from -e:1:in `
' パッチを当てなければ、以下のように動作します。 % ruby -e '2.times { Marshal.dump(1, STDOUT) }'| ruby -e '2.times { p Marshal.load(STDIN) }' 1 1 個人的に最近作っている tb というもので、この動作を利用しているので、 気になるところです。 -- [田中 哲][たなか あきら][Tanaka Akira]