【发布时间】:2018-01-29 02:27:42
【问题描述】:
我在 Python 中的 LXML 库的帮助下解析大型 XML(~500MB)。我已经将 BeautifulSoup 与 lxml-xml 解析器一起用于小文件。但是当我遇到巨大的 XML 时,它效率很低,因为它读取整个文件一次,然后解析它。
我需要解析一个 XML 以获取根到叶路径(最外面的标记除外)。
例如。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE A>
<A>
<B>
<C>
abc
</C>
<D>
abd
</D>
</B>
</A>
上面的 XML 应该给出键和值作为输出(根到叶路径)。
A.B.C = abc
A.B.D = abd
这是我为解析它而编写的代码:
(ignore1 和 ignore2 是需要忽略的标签,tu.clean_text() 是删除不必要字符的函数)
def fast_parser(filename, keys, values, ignore1, ignore2):
context = etree.iterparse(filename, events=('start', 'end',))
path = list()
i = 0
lastevent = ""
for event, elem in context:
i += 1
tag = elem.tag if "}" not in elem.tag else elem.tag.split('}', 1)[1]
if tag == ignore1 or tag == ignore2:
pass
elif event == "start":
path.append(tag)
elif event == "end":
if lastevent == "start":
keys.append(".".join(path))
values.append(tu.clean_text(elem.text))
# free memory
elem.clear()
while elem.getprevious() is not None:
del elem.getparent()[0]
if len(path) > 0:
path.pop()
lastevent = event
del context
return keys, values
解析大文件ibm.com/developerworks/xml/library/x-hiperfparse/#listing4已经参考了下面这篇文章
这是 top 命令的截图。大约 500 MB XML 文件的内存使用量超过 2 GB。我怀疑内存没有被释放。
我已经解决了几个 StackOverflow 问题。但这没有帮助。请指教。
【问题讨论】: