python写xml文件 数据量特别大_使用多处理分析非常大的XML文件

解析非常大的XML文件时节省内存

您可以使用比effbot.org网站第一,它可以为你节省更多的记忆:

Using Python Iterparse For Large XML Files

多处理/多线程

如果我没记错的话,在加载/解析XML时,您不可能轻松地进行多处理来加快进程。如果这是一个简单的选择,那么每个人在默认情况下都可能已经这样做了。

Python通常使用一个全局解释器锁(GIL),这使得Python在一个进程内运行,这与CPU的一个核心绑定在一起。当使用线程时,它们在仍然只绑定到一个内核的主Python进程的上下文中运行。在Python中使用线程可能会由于上下文切换而导致性能下降。在多个内核上运行多个Python进程可以带来预期的额外性能,但是这些进程不共享内存,因此需要进程间通信(IPC)来让进程协同工作(可以在池中使用多处理,它们在工作完成时同步,但对于有限的小任务来说,大多数情况下是有用的)。我认为需要共享内存,因为每个任务都在处理同一个大XML。

然而,LXML有一些方法可以解决GIL问题,但它只在特定条件下提高性能。在

在LXML中线程化

为了在lxml中引入线程,FAQ中有一部分讨论了这一点:http://lxml.de/FAQ.html#id1

我可以使用线程同时访问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以支持多线程。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值