我的工作是处理大量的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文件的文件夹,那么当处理完特定文件时,我能立即得到结果吗。like1st 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个文件的完整结果。
为了处理导入/名称空间错误,我在return_len
函数中定义了import
;有没有更好的方法来处理这个问题?在
当然可以。AsyncMapResult(map_async返回的类型)立即可读取, 迭代生成的项与
r.get()
最终生成的列表相同。所以在你做了之后:您可以:
^{pr2}$或者使用enumerate保存索引
或者使用
reduce
内置函数执行缩减:当结果到达时,所有这些都将在结果中迭代。如果您不关心排序,并且每个任务的时间都有很大的变化,您可以通过
map_async(...,ordered=False)
。如果您这样做,当您迭代AMR时,您将以先到先得的方式获得单个结果,而不是保留提交顺序。在还有更多信息in the ipython docs。在
是和否。有几种方法可以设置引擎名称空间,例如使用模块、
@parallel.require("module")
装饰器,或者简单地使用%px import xml.etree.cElementTree as cElementTree
显式执行导入,每种方法在某些情况下都有好处。但我经常发现在函数中添加导入是最简单的方法,而且意外最少。在相关问题 更多 >
编程相关推荐