2

私の仕事は、たくさんの xml を扱うことです。より高速な結果を得るには、ipython の並列処理を使用したいと考えています。以下は私のサンプルコードです。celementTreeつまり、モジュールを使用してxml/xsdの要素の数を見つけているだけです。

>>> from IPython.parallel import Client
>>> import os
>>> c = Client()
>>> c.ids
>>> lview = c.load_balanced_view()
>>> lview.block =True
>>> def return_len(xml_filepath):
        import xml.etree.cElementTree as cElementTree
        tree = cElementTree.parse(xml_filepath)
        my_count=0
        file_result=[]
        cdict={}
        for elem in tree.getiterator():
            cdict[my_count]={}
            if elem.tag:
                cdict[my_count]['tag']=elem.tag
            if elem.text:
                cdict[my_count]['text']=(elem.text).strip()
            if elem.attrib.items():
                cdict[my_count]['xmlattb']={}
                for key, value in elem.attrib.items():
                    cdict[my_count]['xmlattb'][key]=value
            if list(elem):
                cdict[my_count]['xmlinfo']=len(list(elem))
            if elem.tail:
                cdict[my_count]['tail']=elem.tail.strip()
            my_count+=1
        output=xml_filepath.split('\\')[-1],len(cdict)
        return output
        ## return cdict
>>> def get_dir_list(target_dir, *extensions):
        """
        This function will filter out the files from given dir based on their extensions
        """
        my_paths=[]
        for top, dirs, files in os.walk(target_dir):
            for nm in files:
                fileStats = os.stat(os.path.join(top, nm))
                if nm.split('.')[-1] in extensions:
                    my_paths.append(top+'\\'+nm)
        return my_paths
>>> r=lview.map_async(return_len,get_dir_list('C:\\test_folder','xsd','xml'))

これによって私がしなければならない最終結果を得るには >>> r.get()、プロセスが完了すると結果が得られます

。私の質問は、終了中に中間結果を取得できるかどうかです。
たとえば、1000 個の xmls/xsds ファイルを含むフォルダーに作業を適用した場合、その特定のファイルが処理されたときにすぐに結果を取得できます。1st file is done--> show its result... 2nd file is done---> show its result........ 1000th file is done--> show its result上記のように現在の仕事が好きではありません。wait till final file get finished次に、それらの 1000 ファイルすべての完全な結果が表示されます。
また、インポート/名前空間エラーに対処するために、関数import内で定義しました。return_lenそれに対処するより良い方法はありますか?

4

1 に答える 1

4

もちろん。AsyncMapResult (map_async によって返される型) はすぐに反復可能であり、反復によって生成されるアイテムは、最終的に によって生成されるリストと同じr.get()です。だからあなたがした後:

amr = lview.map_async(return_len, get_dir_list('C:\\test_folder','xsd','xml'))

できるよ:

for r in amr:
    print r

またはenumerateでインデックスを保持する

for i,r in enumerate(amr):
    print i, r 

またはビルトインでリダクションを実行しますreduce:

summary_result = reduce(myfunc, amr)

これらはすべて、結果が到着すると反復処理されます。順序を気にせず、各タスクの時間が大幅に異なる場合は、合格できますmap_async(...,ordered=False)。これを行うと、AMR を反復処理するときに、送信順序を維持するのではなく、先着順で個々の結果が得られます。

ipython docs にもう少し情報があります。

また、インポート/名前空間エラーに対処するために、return_len 関数内でインポートを定義しました。それに対処するより良い方法はありますか?

はいといいえ。エンジンの名前空間を設定するには、モジュールや@parallel.require("module")デコレータを使用する方法や、単純に で明示的にインポートを実行する方法など、いくつかの方法があり%px import xml.etree.cElementTree as cElementTree、それぞれ特定のシナリオで利点があります。しかし、インポートを関数に入れるのが最も簡単な方法であり、驚くことも少ないことがよくあります。

于 2012-11-28T02:52:52.937 に答える