0

比較的大きな xml ドキュメント (5Mb) を取得して処理する定期的にスケジュールされたタスクを実行する必要があります。

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

私はいくつかの大まかな測定を行いました:

  1. タスクは通常、すでに 40 ~ 50 Mb のメモリを使用しているインスタンスにスケジュールされます
  2. 5 MB のテキスト ファイルの URL フェッチにより、インスタンスのメモリ使用量が 65 ~ 75 Mb に増加します。
  3. フェッチしたテキストを Unicode にデコードすると、メモリ使用量が 95 ~ 105 Mb に増加します。
  4. Unicode 文字列を lxml パーサーに渡し、そのルート ノードにアクセスすると、インスタンスのメモリ使用量が約 120 ~ 150 Mb に増加します。
  5. ドキュメントの実際の処理中 (xml ノードをデータストア モデルに変換するなど)、インスタンスは終了します。

エンコードされたテキストを lxml パーサーに直接渡すことで、3 番目のステップを回避してメモリを節約できますが、lxml パーサーのエンコーディングを指定すると、GAE でいくつかの問題が発生します。

おそらくこの作業には MapReduce ライブラリを使用できますが、5 MB のファイルには本当に価値がありますか?

別のオプションとして、タスクを複数のタスクに分割することもできます。

また、おそらくファイルをブロブストアに保存してから、ブロブストアから1行ずつ読み取って処理できますか? 補足として、UrlFetch サービスが応答を「オンデマンド」で読み取れるようにして、大きなドキュメントの処理を簡素化できると便利です。

では、一般的に言えば、そのような種類の作業を実行する最も便利な方法は何ですか?

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

4

1 に答える 1

2

これはフロントエンドインスタンスですか、それともバックエンドインスタンスですか?私にはバックエンドインスタンスの仕事のように見えます。

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

于 2012-04-11T09:38:43.407 に答える