人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

RubyのMechanizeを使って、1GB程度のファイルをダウンロードしようとすると以下のエラーメッセージが出ます。
C:/Ruby/lib/ruby/gems/1.8/gems/mechanize-1.0.0/lib/mechanize/chain/response_reader.rb:16:in `write': failed to allocate memory (NoMemoryError)
from C:/Ruby/lib/ruby/gems/1.8/gems/mechanize-1.0.0/lib/mechanize/chain/response_reader.rb:16:in `handle'

response_reader.rbの16行目付近は以下となります。
12: body = StringIO.new()
13: total = 0
14: @response.read_body { |part|
15: total += part.length
16: body.write(part)
17: Mechanize.log.debug("Read #{total} bytes") if Mechanize.log
18: }

恐らくStringIOオブジェクトのバッファが足りないのが原因と思われます。
writeを実行するたびにflushしようとしたのですが、StringIOのflushメソッドはselfを返すだけで実際にはメモリの内容をディスクに書き出さないようです。
flushする方法を調べたのですが、見付かりませんでした。どなたかご教授頂けますでしょうか。

環境は以下です。
Ruby(MRI) 1.8.7
Mechanize 1.0.0
Vista 64bit

●質問者: anton0825
●カテゴリ:コンピュータ インターネット
✍キーワード:.new BODY CHAIN E-1 LIB
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● t-wata
●100ポイント ベストアンサー

> StringIOのflushメソッドはselfを返すだけで実際にはメモリの内容をディスクに書き出さないようです。

SingIOって、ファイルの入出力はしないですよ。文字列オブジェクトでファイル入出力のメソッドを仮想的に使えるようにしたものがStringIOですから。

ファイルに書き込みたいなら、StringIO.newの代わりにopen("output.file.name", "w")にすればよいのでは?

◎質問者からの返答

回答ありがとうございました。t-wadaさんから回答頂けるとは、びっくりです。ブログいつも拝見しています。

やはりFileオブジェクトを作ってflushさせるしかないですよね。

Mechanizeのget_fileメソッドを修正すべきと思いますので修正してコードをAuthorに送ってみます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ