为什么python元素树占用了这么多内存?

时间:2013-12-28 11:13:44

标签: python-2.7 elementtree export-to-csv

我即将从一个巨大的(4 GB)xml文件中找到一些特定信息。为了避免使用太多内存,我在Python中使用了元素树库的iterparse方法。这看起来效果很好,Python的内存使用量是ca.大部分为3.5 MB。但是当它到达程序的最后时,内存使用量会增加到几千兆字节,而且它似乎永远不会完成。

从输出csv文件中,似乎该程序已经通过了所有感兴趣的元素,但在完成程序时遇到了一些问题。任何人都可以看到我的程序出了什么问题,并告诉我它为什么会这样做?

该程序如下所示:

import xml.etree.ElementTree as ET

output_file = 'output.csv'
input_file = 'raw_data/denmark-latest.xml'

parser = ET.iterparse(input_file, events=("start", "end"))
parser = iter(parser)
event, root = parser.next()

with open(output_file, 'a', 1) as f:
  for event, element in parser:
    if event == "start" and element.tag == "node":  

      for node in element.findall(".//tag/[@k='addr:housenumber']/..[@lat]"):
        f = open(output_file, "a")
        lat = node.get('lat')
        lon = node.get('lon')

        for tag in node.findall("./tag/[@k='addr:city']"):
          city = tag.get('v')

        for tag in node.findall("./tag/[@k='addr:postcode']"):
          postcode = tag.get('v')

        for tag in node.findall("./tag/[@k='addr:street']"):
          street = tag.get('v')

        for tag in node.findall("./tag/[@k='addr:housenumber']"):
          houseno = tag.get('v')

        string = str(lat) + ', ' + str(lon) + ', ' + str(postcode) + ', ' + str(city) + ', ' + str(street) + ', ' + str(houseno) +'\n'
        f.write(string)

      root.clear()

0 个答案:

没有答案