在获取大型文档时,避免超出软私有内存限制

时间:2012-04-11 09:23:43

标签: google-app-engine

我需要运行定期执行的任务,以获取相对较大的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节点转换为数据存储模型等),实例将终止。
  6. 我可以通过将编码文本直接传递给lxml解析器来避免第3步并节省一些内存,但specifying encoding for lxml parser has some problems on GAE对我来说。

    我可以使用MapReduce库来完成这项工作,但对于一个5mb的文件真的值得吗?

    另一种选择可能是将任务分成几个任务。

    此外,我可以将文件保存到blobstore,然后通过从blobstore逐行读取来处理它?作为旁注,如果UrlFetch服务允许“按需”读取响应以简化大型文档的处理,那将是很方便的。

    一般来说,执行此类工作最方便的方法是什么?

    谢谢!

1 个答案:

答案 0 :(得分:2)

这是在前端还是后端实例?看起来像是后端实例的工作。

您是否考虑过使用不同的实例类型?