1

我有一个 ~1GB XML 文件,其中包含我需要从中获取数据的 XML 标记。我有以下格式的 XML 文件(我只是粘贴示例数据,因为实际文件的大小约为 1 GB)。

报告.xml

<report>
  <report-name name="ALL_TIME_KEYWORDS_PERFORMANCE_REPORT"/>
  <date-range date="All Time"/>
  <table>
  <row campaignID="79057390" adGroupID="3451305670" keywordID="3000000" keyword="Content" avgPosition="1.55" cost="252910000" clicks="11" conv1PerClick="0" impressions="7395" day="2012-04-23" currency="INR" account="Virtual Voyage" timeZone="(GMT+05:30) India Standard Time" viewThroughConv="0"/>

  <row campaignID="79057390" adGroupID="3451305670" keywordID="3000000" keyword="Content" avgPosition="1.16" cost="0" clicks="0" conv1PerClick="0" impressions="160" day="2012-04-23" currency="INR" account="Virtual Voyage" timeZone="(GMT+05:30) India Standard Time" viewThroughConv="0"/>

  <row campaignID="79057390" adGroupID="3451305670" keywordID="3000000" keyword="Content" avgPosition="1.56" cost="0" clicks="0" conv1PerClick="0" impressions="34" day="2012-04-23" currency="INR" account="Virtual Voyage" timeZone="(GMT+05:30) India Standard Time" viewThroughConv="0"/>

  </table>
</report>
  1. 在 Python 中解析/处理 XML 文件并从 xml 标签中获取数据的最佳方法是什么?

  2. 有没有可以处理 XML 文件的框架?

  3. 该方法需要快速;它需要在 100 秒内完成。

我一直在使用 Hadoop 和 Python 来处理 XML 文件,处理数据通常需要将近 200 秒......所以我正在寻找一种替代解决方案来解析上述 XML 标签并从标签中获取数据。

从某种意义上说,这是来自标签的数据:

 campaignID="79057390" adGroupID="3451305670" keywordID="3000000" keyword="Content" avgPosition="1.16" cost="0" clicks="0" ...

处理完 XML 文件后,我会将数据和值 (79057390,3451305670 ...) 存储在 MySQL 数据库中。我所需要的只是能够处理大约 1GB 大小的 XML 文件,并在不到 100 秒的时间内将处理后的数据保存到 MySQL 数据库中。

4

1 回答 1

2

我最近遇到了一个类似的问题,为我解决的方法是使用 iterparse 函数和 lxml,最后,它都是基于使用类似 SAX 的解析器而不是类似 DOM 的解析器,记住 DOM 在内存中工作而 SAX 是事件驱动的,因此您将使用 SAX 节省大量内存(这也意味着时间!因为您无需等待加载所有文档即可解析它!)

我认为你可以使用这样的东西

import xml.etree.cElementTree as ET

file_path = "/path/to/your/test.xml"
context = ET.iterparse(file_path, events=("start", "end")) #Probably we could use only the start tag
# turn it into an iterator
context = iter(context)
on_members_tag = False

for event, elem in context:
    tag = elem.tag
    value = elem.text
    if value :
        value = value.encode('utf-8').strip()       
    if event == 'start' :
        if tag == "row" :
            attribs = elem.attrib
            print "This is the campaignID %s and this is the adGroupID" % (attribs['campaignID'] , attribs['adGroupID'])

    elem.clear() #Save memory!
于 2012-11-30T06:35:09.157 回答