首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用多处理技术解析超大XML文件

使用多处理技术解析超大XML文件
EN

Stack Overflow用户
提问于 2014-01-27 20:26:50
回答 2查看 2.6K关注 0票数 7

我有一个很大的XML文件,我有点不知道如何处理它。它有60 GB,我需要读一读。

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

有谁有任何这样做的样本可以给我指给我看?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2014-01-27 21:52:41

对于这种大小的文件,我建议您使用流式XML解析器。在Python中,这是来自cElementTree或lxml.etree的iterparse方法:

http://effbot.org/zone/element-iterparse.htm

票数 4
EN

Stack Overflow用户

发布于 2016-10-25 22:26:15

节省内存解析非常大的XML文件您可以使用下面的代码,它比effbot.org代码更新一点,它可能会节省更多的内存:Using Python Iterparse For Large XML Files

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

lxml中的线程介绍lxml中的线程在常见问题解答中有一部分谈到了这一点:http://lxml.de/FAQ.html#id1

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

简短的回答是:是的,如果您使用lxml 2.2或更高版本。

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

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

视情况而定。回答这个问题的最好方法是计时和分析。

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

查看上面的问题,了解哪些操作释放了GIL以支持多线程。

有关优化大型XML https://www.ibm.com/developerworks/library/x-hiperfparse/解析性能的其他提示

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21380884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档