当前位置: 首页 > 知识库问答 >
问题:

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

禄豪
2023-03-14

我正在尝试获取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,但在导入它时遇到了问题。我下载了lxml2.3库并将其放入我的应用程序文件夹中(我知道这并不理想,但这是我知道如何包含第三方库的唯一方法)。此外,我在我的应用程序中添加了以下内容。亚马尔:

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

我已经检查了关于这个错误的其他问题,似乎我在Windows7上运行的事实可能起到了作用。我还尝试从中安装预编译的二进制软件包http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml,但这也没有改变任何事情。

共有1个答案

隗锐进
2023-03-14

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

以下是一些改进:

  1. del每个缓冲区变量在您不需要它的时候
 类似资料:
  • 问题内容: 我正在尝试将以下feed解析为python中的ElementTree:“ http://smarkets.s3.amazonaws.com/oddsfeed.xml ”(警告大文件) 到目前为止,这是我尝试过的: 但是它似乎只是挂在上面,也许是无限地??(我知道这是一个大文件,但与我解析的其他非压缩提要相比似乎太长了,而这个大文件首先会扼杀gzip压缩带来的任何带宽增长)。 接下来我尝

  • 解析redis的lzf压缩和解压算法

  • 问题内容: 我想使用urllib下载文件,并在保存之前对文件进行解压缩。 这就是我现在所拥有的: 最终将写入空文件。我该如何实现自己的追求? 更新的答案: 问题答案: 在写完之后,但要传递给之前,您需要寻找到开始的地方。否则它将被模块从头读取,并显示为空文件。见下文:

  • tar [-]c|x|u|r|t[z|j][v] -f 归档文件 [待打包文件] 将多个文件打包为一个归档文件,可以在打包的同时进行压缩。支持的格式为 tar(归档)、gz(压缩)、bz2(压缩率更高,比较耗时) 操作选项 -c 创建 -x 解包 -u 更新 -r 添加 -t 查看 -d 比较压缩包内文件和文件 -A 将 tar 文件添加到归档文件中 格式选项 -z 使用 gz 压缩格式 -j 使

  • 77.概述 内存压缩(A.K.A Accordion)是 hbase-2.0.0 中的一项新功能。它首先在 Accordion 的 Apache HBase 博客上推出:HBase 通过内存压缩进行呼吸。引用博客: Accordion 将 LSM 主体[ Log-Structured-Merge Tree ,HBase 所基于的设计模式]重新应用于 MemStore,以便在数据仍在 RAM 中时消

  • 问题内容: 我已经从http://mirrors.ibiblio.org/pub/mirrors/maven2/dot-index/nexus-maven- repository-index.gz 下载了为Maven Central生成的索引。 我想列出这些索引文件(例如groupId,artifactId,版本)中的工件信息。我读过有一个高级API。看来我必须使用以下Maven依赖项。但是,我不