簡體   English   中英

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

[英]Parsing Very Large XML Files Using Multiprocessing

我有一個巨大的XML文件,我對如何處理它有點不知所措。 它是60 GB,我需要閱讀它。

我在想是否有辦法使用多處理模塊來讀取python文件?

有沒有人有這樣做的樣本,他們可以指點我?

謝謝

對於那個大小的文件,我建議你使用流式XML解析器。 在Python中,這將是來自cElementTree或lxml.etree的iterparse方法:

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

保存內存解析非常大的XML文件您可以使用這個比effbot.org更新的代碼,它可以為您節省更多內存: 使用Python Iterparse用於大型XML文件

多處理/多線程如果我沒記錯的話,在加載/解析XML時,不能輕易地進行多處理以加快處理速度。 如果這是一個簡單的選擇,那么每個人都可能已經默認這樣做了。 Python通常使用全局解釋器鎖(GIL),這會導致Python在一個進程內運行,並且這綁定到CPU的一個核心。 當使用線程時,它們在主Python進程的上下文中運行,該進程仍然只綁定到一個核心。 在Python中使用線程可能會因上下文切換而導致性能下降。 在多個內核上運行多個Python進程帶來了預期的額外性能,但那些不共享內存,因此您需要進程間通信(IPC)以使進程協同工作(您可以在池中使用多處理,它們在工作完成后同步但主要用於(不是)有限的小任務。 我需要共享內存,因為每個任務都在使用同一個大XML。 然而,LXML有一些解決GIL的方法,但它只能在某些條件下提高性能。

LXML中的線程為了在lxml中引入線程,FAQ中有一部分討論了這個問題: 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代碼(步行樹,修改元素等)中完成的,那么您的增益將接近於零。 然而,越多的XML處理進入lxml,你的收益就越高。 如果您的應用程序受XML解析和序列化約束,或者通過非常有選擇性的XPath表達式和復雜的XSLT綁定,那么您在多處理器計算機上的加速可能會很大。

請參閱上面的問題,了解哪些操作可以釋放GIL以支持多線程。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM