Python 使用多处理解析非常大的XML文件

Python 使用多处理解析非常大的XML文件,python,xml,multiprocessing,Python,Xml,Multiprocessing,我有一个巨大的XML文件,我对如何处理它有点不知所措。60 GBs,我需要读一下 我在想,是否有一种方法可以使用多处理模块来读取python文件 有没有人能给我提供一些这样做的例子 感谢您提供如此大小的文件,我建议您使用流式XML解析器。在Python中,这将是来自cElementTree或lxml.etree的iterparse方法: 解析非常大的XML文件时节省内存 您可以使用比effbot.org稍新的代码,它可能会为您节省更多内存: 多处理/多线程 如果我没记错的话,在加载/解析XML

我有一个巨大的XML文件,我对如何处理它有点不知所措。60 GBs,我需要读一下

我在想,是否有一种方法可以使用多处理模块来读取python文件

有没有人能给我提供一些这样做的例子


感谢您提供如此大小的文件,我建议您使用流式XML解析器。在Python中,这将是来自cElementTree或lxml.etree的
iterparse
方法:


解析非常大的XML文件时节省内存 您可以使用比effbot.org稍新的代码,它可能会为您节省更多内存:

多处理/多线程 如果我没记错的话,在加载/解析XML时,您不能轻松地进行多处理以加快过程。如果这是一个简单的选择,那么默认情况下每个人都可能已经这么做了。 Python通常使用全局解释器锁(GIL),这会导致Python在一个进程内运行,并绑定到CPU的一个核心。当线程被使用时,它们在主Python进程的上下文中运行,该进程仍然只绑定到一个核心。在Python中使用线程可能会由于上下文切换而导致性能下降。在多个内核上运行多个Python进程会带来预期的额外性能,但这些进程不会共享内存,因此您需要进程间通信(IPC)才能使进程协同工作(您可以在池中使用多处理,它们在工作完成时会同步,但对于有限的小任务(而不是)最有用)。我认为共享内存是必需的,因为每个任务都在同一个大XML上工作。 然而,LXML有一些方法可以绕过GIL,但它只能在某些条件下提高性能

在LXML中线程化 要介绍lxml中的线程,常见问题解答中有一部分谈到了这一点:

我可以使用线程并发访问lxml API吗

简短回答:是的,如果您使用lxml2.2及更高版本

从1.1版开始,lxml在从磁盘和内存解析时在内部释放GIL(Python的全局解释器锁),只要您使用默认解析器(为每个线程复制)或自己为每个线程创建解析器。lxml还允许在验证(RelaxNG和XMLSchema)和XSL转换期间并发。您可以在线程之间共享RelaxNG、XMLSchema和XSLT对象

如果我使用线程,我的程序运行得更快吗

视情况而定。解决这个问题的最佳方法是计时和分析

Python中的全局解释器锁(GIL)序列化了对解释器的访问,因此,如果您的大部分处理是在Python代码中完成的(遍历树、修改元素等),那么您的收益将接近于零。然而,XML处理越多地转移到lxml中,您的收益就越高。如果您的应用程序受到XML解析和序列化的约束,或者受到非常有选择性的XPath表达式和复杂XSLT的约束,那么您在多处理器机器上的加速可能会非常快

请参阅上面的问题,了解哪些操作可以释放GIL以支持多线程

有关优化解析大型XML性能的其他提示

我建议您选择这些现有答案中的一个:或者您想对处理结果做些什么?好的,那么我可以为读取XML做一些准备,如何在多个CPU之间分配这些内容以加快数据读取?秩序不重要。