比較的大きな xml ドキュメント (5Mb) を取得して処理する定期的にスケジュールされたタスクを実行する必要があります。
現在発生している問題は、アプリケーション インスタンスのメモリ制限に達し、タスクの実行中にインスタンスが終了することです。
私はいくつかの大まかな測定を行いました:
- タスクは通常、すでに 40 ~ 50 Mb のメモリを使用しているインスタンスにスケジュールされます
- 5 MB のテキスト ファイルの URL フェッチにより、インスタンスのメモリ使用量が 65 ~ 75 Mb に増加します。
- フェッチしたテキストを Unicode にデコードすると、メモリ使用量が 95 ~ 105 Mb に増加します。
- Unicode 文字列を lxml パーサーに渡し、そのルート ノードにアクセスすると、インスタンスのメモリ使用量が約 120 ~ 150 Mb に増加します。
- ドキュメントの実際の処理中 (xml ノードをデータストア モデルに変換するなど)、インスタンスは終了します。
エンコードされたテキストを lxml パーサーに直接渡すことで、3 番目のステップを回避してメモリを節約できますが、lxml パーサーのエンコーディングを指定すると、GAE でいくつかの問題が発生します。
おそらくこの作業には MapReduce ライブラリを使用できますが、5 MB のファイルには本当に価値がありますか?
別のオプションとして、タスクを複数のタスクに分割することもできます。
また、おそらくファイルをブロブストアに保存してから、ブロブストアから1行ずつ読み取って処理できますか? 補足として、UrlFetch サービスが応答を「オンデマンド」で読み取れるようにして、大きなドキュメントの処理を簡素化できると便利です。
では、一般的に言えば、そのような種類の作業を実行する最も便利な方法は何ですか?
ありがとうございました!