2011-01-22 19 views
0

cElementTree.iterparseを使用して繰り返し処理する大規模なXML文書(ファイルサイズ> 100 MB)を想像してみましょう。マルチ処理を使用してetree.iterparseを分割して征服する

しかし、インテルが私たちに約束してくれたコアは、どのように使用するのですか?ここで私が欲しいものです:、これでいくつかの問題点を持っていると考え

from itertools import islice 
from xml.etree import ElementTree as etree 

tree_iter = etree.iterparse(open("large_file.xml", encoding="utf-8")) 

first = islice(tree_iter, 0, 10000) 
second = islice(tree_iter, 10000) 

parse_first() 
parse_second() 

なく、少なくとも()iterparseによって返されたイテレータは薄切りに耐えるように見えるということで。

メモリにドキュメント全体をロードしない2つのまたは4つの別々のタスク(?目的は、別々のプロセッサ上でタスクを実行するために、次にことに大きなXML文書の解析作業負荷を分割する方法がある。

答えて

0

Iが。この非常に良いものは、(それがのpython3でだが、2.xのに変換することも難しくはありません)私が見つけた(および使用)あなたは、このためのタスクキューとの良好なスレッドプールが必要だと思う:

# http://code.activestate.com/recipes/577187-python-thread-pool/ 

from queue import Queue 
from threading import Thread 

class Worker(Thread): 
    def __init__(self, tasks): 
     Thread.__init__(self) 
     self.tasks = tasks 
     self.daemon = True 
     self.start() 

    def run(self): 
     while True: 
      func, args, kargs = self.tasks.get() 
      try: func(*args, **kargs) 
      except Exception as exception: print(exception) 
      self.tasks.task_done() 

class ThreadPool: 
    def __init__(self, num_threads): 
     self.tasks = Queue(num_threads) 
     for _ in range(num_threads): Worker(self.tasks) 

    def add_task(self, func, *args, **kargs): 
     self.tasks.put((func, args, kargs)) 

    def wait_completion(self): 
     self.tasks.join() 

今度はiterparseでループを実行し、スレッドプールで作業を分けることができます。これを使用するのは簡単です:

def executetask(arg): 
    print(arg) 

workers = threadpool.ThreadPool(4) # 4 is the number of threads 
for i in range(100): workers.add_task(executetask, i) 

workers.wait_completion() # not needed, only if you need to be certain all work is done before continuing 
+0

私はそれぞれの要素を解析する関数でworkers.add_taskを呼び出すと思いますか? etree.parseiter()のelem:workers.add_task(parseElem、elem)?問題は、解析が比較的簡単であるため、パフォーマンスが向上しないことです。私が必要とするのは、etree.parseiter()を管理可能な塊に分割することです。理想的には、反復の100.000要素のうち、プールの各スレッドに25.000を与えます。それは可能ですか? –

+0

それはあなたが何をするかによって異なりますが、私は推測します。 – orlp

関連する問題