GAE Python:解析压缩的XML超出内存

时间:2013-01-27 16:41:50

标签: python xml google-app-engine gzip

我正在尝试将XML文件提取并解析为数据库。 XML在GZIP中压缩。 GZIP文件大约为8MB。当我在本地运行代码时,pythonw.exe上的内存会升级到整个系统(Windows 7)停止响应的级别,当我在线运行它时,它超出了Google App Engine的内存限制。不确定文件是否太大或者我做错了什么。非常感谢任何帮助!

from google.appengine.ext import webapp
from google.appengine.api.urlfetch import fetch
from xml.dom.minidom import parseString
import gzip
import base64
import StringIO

class ParseCatalog(webapp.RequestHandler):
user = xxx
password = yyy
catalog = fetch('url',
                    headers={"Authorization": 
                             "Basic %s" % base64.b64encode(user + ':' + password)}, deadline=600)
xmlstring = StringIO.StringIO(catalog.content)
gz = gzip.GzipFile(fileobj=xmlstring)
gzcontent = gz.read()
contentxml = parseString(gzcontent)
items = contentxml.getElementsByTagName("Product")

for item in items:
    item = DatabaseEntry()
    item.name = str(coupon.getElementsByTagName("Manufacturer")[0].firstChild.data)
    item.put()

更新

所以我尝试按照BasicWolf的建议切换到LXML但是导入它时遇到问题。我下载了LXML 2.3库并将其放在我的应用程序的文件夹中(我知道这不是理想的,但这是我知道如何包含第三方库的唯一方法)。另外,我在app.yaml中添加了以下内容:

libraries:
- name: lxml
  version: "2.3"

然后我编写了以下代码来测试它是否解析:

import lxml

class ParseCatalog(webapp.RequestHandler):
    user = xxx
    password = yyy
    catalog = fetch('url',
                    headers={"Authorization": 
                             "Basic %s" % base64.b64encode(user + ':' + password)}, deadline=600)
    items = etree.iterparse(catalog.content)

    def get(self): 
       for elem in items:
           self.response.out.write(str(elem.tag))

但是这会导致以下错误:

ImportError: cannot import name etree

我已经检查了有关此错误的其他问题,似乎我在Windows 7上运行的事实可能会发挥作用。我还试图从http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml安装预编译的二进制包,但这也没有改变任何东西。

1 个答案:

答案 0 :(得分:3)

你期待什么?首先,你将一个字符串读入内存,然后 - 将其解压缩到内存中,然后 - 构建一个仍然在内存中的DOM树。

以下是一些改进:

  1. del每个缓冲变量在您不需要它的时候。
  2. 摆脱DOM XML解析器,使用事件驱动的LXML来节省内存。