我即将从一个巨大的(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()