2016-08-05 6 views
0

で、インメモリXMLツリーを解析するには、私はこのようになりますプログラムを持っていると言う:並行lxmlの

from lxml import etree 

class ParseXmlFile(object): 
    def __init__(self, xml_to_parse): 
     self.xml = etree.parse(xml_to_parse) 

    def a(self): 
     return self.xml.xpath('//something') 

    def b(self): 
     return self.xml.xpath('//something-else') 

lxmlのはGILを解放し、別のスレッドやプロセスで同時にabを実行することが可能です。 lxmlのドキュメントから

lxml frees the GIL (Python's global interpreter lock) internally when parsing from disk and memory...The global interpreter lock (GIL) in Python serializes access to the interpreter, so if the majority of your processing is done in Python code (walking trees, modifying elements, etc.), your gain will be close to zero. The more of your XML processing moves into lxml, however, the higher your gain. If your application is bound by XML parsing and serialisation, or by very selective XPath expressions and complex XSLTs, your speedup on multi-processor machines can be substantial.

私はマルチスレッドでの作業なしにはほとんどを行っています。

ミルのマルチプロセッシングの実行は、multiprocessing.Pool().map()のようなものを使用します。これは、関数のリストと単一の引数ではなく、引数のリストであるため、ここでは役に立たないようです。別の関数内の各機能をラップして、答えの一つに記載のマルチしようとすると、次の例外が発生します:

cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed 

は、私が説明してる何をすることが可能ですか?もしそうなら、どうですか?

+0

http://stackoverflow.com/questions/25991860/unable-to-pass-an-lxml-etree-object-to- a-separate-process –

+0

@PadraicCunninghamこれがどのように役立つか分かりません。あなた自身がリンクしているものは、私の質問に答えません。いずれにしても、以下の答えで私が経験するエラーは、被拾い可能ではない関数によるものです。 etreeをピックラーに登録してもそれは解決しません。 – AutomaticStatic

答えて

1

機能は、データなので、あなたがこのような何かを行うことができます。

from multiprocessing import Pool 

def f1(xml): 
    print "applying f1 to xml" 

def f2(xml): 
    print "applying f2 to xml" 

if __name__ == '__main__': 
    xml = "the xml" 

    def applyf(f): 
     f(xml) 

    p = Pool(5) 
    print(p.map(applyf, [f1, f2])) 
+0

'cPickle.PicklingError:をpickleできません:属性ルックアップ__builtin __。function failed' – AutomaticStatic

+0

上記のコードはPython 2.7でエラーなく実行されます。どうやってそのエラーになっていますか? – ErikR

+0

オクラホマ - あなたの質問へのアップデートが表示されます。 – ErikR