1

Rails 3.1.1 を使用し、Heroku にデプロイしています。オープンウリとノコギリを使用しています。

xml ファイルを取得して解析しようとしているときに発生するメモリ リーク (?) をトラブルシューティングしようとしています。フェッチして解析しようとしている XML フィードは 32 Mb です。

私はそれに次のコードを使用しています:

require 'open-uri'   
open_uri_fetched = open(feed.fetch_url)
xml_list = Nokogiri::HTML(open_uri_fetched)

ここで、feed.fetch_url は外部の xml ファイルです。

Nokogiri (私のコードの最後の行) で xml_list を解析している間、メモリ使用量は 540 Mb の使用量まで爆発し、増加し続けているようです。XML ファイルは 32 MB しかないため、これは論理的ではないようです。

これをより適切に分析する方法 (例: Ruby/Ruby on Rails メモリ リーク検出)を探しましたが、それらの使用方法がわかりません。MemoryLogic は十分に単純に見えますが、インストール手順には情報が不足しているようです...

ですから、上記のコードがそれだけの量のメモリを使用するべきかどうか、またはメモリ リークを見つける方法に関する (非常に単純な) 指示のどちらかを判断するのを手伝ってください。

前もって感謝します!

4

2 に答える 2

2

大きな xml ファイルを解析してドキュメント ツリーに変換すると、一般に、xml データ自体よりもはるかに大きなメモリ内表現が作成されます。たとえば、

<foo attr="b" />

長さはわずか 16 バイトです (1 バイト文字エンコーディングを想定)。このドキュメントのメモリ内表現には、要素自体を表すオブジェクトが含まれます。おそらく、子の (空の) コレクション、少なくとも 1 つのものを含むその要素の属性のコレクションです。要素自体には、その名前、親ドキュメントへの名前空間ポインターなどのプロパティがあります。これらのそれぞれのデータ構造は、nokogiri によって ruby​​ オブジェクトにラップされる前であっても、おそらく 16 バイトを超えることになります (それぞれのメモリ フットプリントはほぼ確実に >= 16 バイトです)。

大きな xml ファイルを解析している場合は、ほぼ確実に、ドキュメント全体でツリー表現を構築してから作業するのではなく、ドキュメント内で検出された要素に応答するSAX パーサーのようなイベント ドリブン パーサーを使用する必要があります。

于 2012-05-15T12:41:06.043 に答える
1

heroku で許可されている「長時間実行タスク」の上限に達していませんか?

私はタイムアウトし、herokuが景品の人々に課すいくつかの制限のために、常に失敗しました。

つまり、開発でこれを複製できますか? あなたのマシンがやりたいことをするのにどれくらいの時間がかかりますか?

編集1:

ところでこれも何?

open_uri_fetched = open(feed.fetch_url)

取得している URL はどこにありますか? それはそこで壊れますか、それとも実際のノコギリコールで壊れますか。とにかく、このフェッチにはどれくらいの時間がかかりますか?

于 2012-05-15T11:21:02.067 に答える