我正在解析一个大文件(> 9GB),并在 Python 中使用 lxml 的 iterparse 来解析文件,同时在我前进时进行清除。我想知道,有没有办法在清除时向后解析?我可以看到我将如何独立于 lxml 实现它,但使用这个包会很好。
先感谢您!
是的和不...
有一个“简单”的解决方案可以从“从头到尾”反向开始。但是有一个反向迭代器会一直运行到最后并在“清除引用”并优化读取的过程中。
方法 1:在其结构和节点上拆分文件,以便您可以解析您只想要的内容。
方法 2:在 [1] 处检查解析它的“智能”方式
我在我的情况下做了什么。我之前就知道,12gb 文件中的数据可能是最后 2gb。所以我使用unix命令来分割文件并只处理最后一个。
(这是一个丑陋的黑客,但在我的情况下很简单并且工作速度足够快,你也可以使用 tail 但我也想存档其他文件)
--> 真正的 python 大师会使用 file.seek() 但我认为 unix 命令更快
现在我使用第二种方法 [1]
[1] - http://www.ibm.com/developerworks/xml/library/x-hiperfparse/
我希望这可以帮助你我很难理解 xml 结构。
iterparse()
恐怕是严格向前的。如果你想反向读取一棵树,你必须向前读取它,同时以某种更容易向后解析的形式将它写入某个中间存储(无论是在内存中还是在磁盘上),然后读取它. 我不知道有任何流解析器允许从后到前解析 XML。
在我的脑海中,您可以使用两个文件,一个包含数据,另一个包含数据文件中记录的偏移量索引。一旦它被写入,这将使向后阅读变得相对容易。