私の仕事は、たくさんの 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
それに対処するより良い方法はありますか?