Python-从XML到JSON再到文件/RAM和交换重载
我目前正致力于创建一种通过OpenStreetMaps省/州转储解析的Python方式;据我所知,这只是知道如何处理非常大的XML文件(对吗?) 我目前正在使用模块,以便通过(魁北克最新版本的.osm.bz2)进行解析。我想提取任何包含高速公路信息的条目,转换成JSON,保存到文件,然后刷新,尽管它似乎不起作用 我目前运行的是i7-4770、16GBs内存、128gbssd和osx10.9。当我启动下面的代码时,我的RAM在几秒钟内完全填满,我的交换在30秒内完成。之后,我的系统会要求我关闭应用程序以腾出空间,或者最终冻结 这是我的密码;你可能会注意到里面有很多糟糕的/garbadge代码,但我已经到了一个地步,我插入了我能找到的任何东西,希望它能工作。在此方面的任何帮助都将不胜感激。谢谢Python-从XML到JSON再到文件/RAM和交换重载,python,xml,json,lxml,openstreetmap,Python,Xml,Json,Lxml,Openstreetmap,我目前正致力于创建一种通过OpenStreetMaps省/州转储解析的Python方式;据我所知,这只是知道如何处理非常大的XML文件(对吗?) 我目前正在使用模块,以便通过(魁北克最新版本的.osm.bz2)进行解析。我想提取任何包含高速公路信息的条目,转换成JSON,保存到文件,然后刷新,尽管它似乎不起作用 我目前运行的是i7-4770、16GBs内存、128gbssd和osx10.9。当我启动下面的代码时,我的RAM在几秒钟内完全填满,我的交换在30秒内完成。之后,我的系统会要求我关闭应用
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from lxml import etree
import xmltodict, json, sys, os, gc
hwTypes = ['motorway', 'trunk', 'primary', 'secondary', 'tertiary', 'pedestrian', 'unclassified', 'service']
#Enable Garbadge Collection
gc.enable()
def processXML(tagType):
f = open('quebecHighways.json', 'w')
f.write('[')
print 'Processing '
for event, element in etree.iterparse('quebec-latest.osm', tag=tagType):
data = etree.tostring(element)
data = xmltodict.parse(data)
keys = data[tagType].keys()
if 'tag' in keys:
if isinstance(data[tagType]['tag'], dict):
if data[tagType]['tag']['@k'] == 'highway':
if data[tagType]['tag']['@v'] in hwTypes:
f.write(json.dumps(data)+',')
f.flush() #Flush Python
os.fsync(f.fileno()) #Flush System
gc.collect() #Garbadge Collect
else:
for y in data[tagType]['tag']:
if y['@k'] == 'highway':
if y['@v'] in hwTypes:
f.write(json.dumps(data)+',')
f.flush()
os.fsync(f.fileno())
gc.collect()
break
#Supposedly there is supposed to help clean my RAM.
element.clear()
while element.getprevious() is not None:
del element.getparent()[0]
f.write(']')
f.close()
return 0
processXML('way')
库
xmltodict
将生成的字典存储在内存中,因此如果您的数据字典很大,那么这样做并不是一个好主意。只使用iterparse
会更有效
另一种选择是使用xmltodict提供的流媒体功能。更多信息请点击。我想说的是,你让你的生活变得更加复杂。您可以有效地反复将整个子树转储到
xmltodict
中,并让它一次又一次地解析整个子树
如果我是你,我会把xmltodict
,坐在你身后,读一两篇教程,然后用一些标准的东西:xml.sax
(如果你不需要太多的跳转,这真的没那么难;只需要继续工作)或者iterparse
,然后使用它。其实没那么复杂。也许这会有帮助:。