2012-04-11 4 views
0

比較的大きなxml文書(5Mb)をフェッチして処理する定期的なタスクを実行する必要があります。大きな文書をurl-fetchingするときのソフトプライベートメモリの制限を避ける

私が現在抱えている問題は、アプリケーションインスタンスのメモリ制限に達し、インスタンスが終了したことです。タスクが実行中です。

Iは、いくつかの大まかな測定を行った:

  1. タスクは、通常、既に5メガバイトのテキストファイルの
  2. のURLフェッチが65〜にインスタンスのメモリ使用量を増加させるメモリの40〜50 MBの使用インスタンスに予定されています75Mb。
  3. フェッチされたテキストをUnicodeにデコードすると、メモリ使用量が95-105 Mbに増加します。
  4. ユニコード文字列をlxmlパーサに渡し、そのルートノードにアクセスすると、インスタンスのメモリ使用量が約120-150 Mbに増加します。
  5. 文書の実際の処理(XMLノードからデータストアモデルへの変換など)では、インスタンスは終了します。

コード化されたテキストをlxmlパーサーに直接渡してメモリを節約できますが、私にとってはspecifying encoding for lxml parser has some problems on GAEです。

私はおそらく、この仕事のためにMapReduceライブラリを使うことができますが、5MBのファイルにとって本当に価値がありますか?

タスクを複数のタスクに分割することもできます。

また、ファイルをblobstoreに保存してから、blobstoreから行ごとに読み取って処理できますか?副次的なこととして、UrlFetchサービスが大きな文書の処理を簡素化するために「オンデマンドで」応答を読み取ることができると便利です。

このような作業を行う最も簡単な方法は何ですか?

ありがとうございました!

+0

あなたはSAXパーサではなく、DOMのいずれかを使用することができますか? –

答えて

2

これはフロントエンドまたはバックエンドのインスタンスにありますか?私のバックエンドインスタンスのための仕事のように見えます。

異なるインスタンスタイプの使用を検討しましたか?

+0

あなたの答えをありがとう。現在、私はタスクとしてこのジョブを実行しようとしています。したがって、これはフロントエンド(F1)インスタンス上にあります。私は本当にインスタンスクラスを変更しようとは思っていません。なぜなら、私のアプリへのユーザーリクエストは重くなく、F1インスタンスもうまく機能するからです。しかし、私は本当にバックエンドインスタンスを試してみたはずです。私は結果を報告しようとします。 – Maxim

+1

タスクを含むフロントエンドインスタンスに限定されないことに注意してください。バックエンドインスタンスにタスクをディスパッチすることもできます。 – alex

関連する問題