Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python实现ArcGIS中的多线程_Python_Multithreading_Arcgis - Fatal编程技术网

用Python实现ArcGIS中的多线程

用Python实现ArcGIS中的多线程,python,multithreading,arcgis,Python,Multithreading,Arcgis,我有一个python脚本,当它自己运行时效果非常好。基于硬编码的输入目录,它扫描所有.mdb文件并将其放入列表中,然后在for循环中遍历它们。每个迭代都涉及多个表限制、联接、查询等 唯一的问题是。。在输入数据集上运行大约需要36个小时,虽然此脚本在本例中仅用于此数据集,但我希望提高性能,因为我经常编辑字段选择、要包含的结果、连接方法等。我想说,这需要很长时间,因为我的脚本效率低下,但是,由于几乎所有的处理时间都专用于地理处理器对象,因此任何低效率都是很小的 在我的主要剧本中,我所能做的就是: i

我有一个python脚本,当它自己运行时效果非常好。基于硬编码的输入目录,它扫描所有.mdb文件并将其放入列表中,然后在for循环中遍历它们。每个迭代都涉及多个表限制、联接、查询等

唯一的问题是。。在输入数据集上运行大约需要36个小时,虽然此脚本在本例中仅用于此数据集,但我希望提高性能,因为我经常编辑字段选择、要包含的结果、连接方法等。我想说,这需要很长时间,因为我的脚本效率低下,但是,由于几乎所有的处理时间都专用于地理处理器对象,因此任何低效率都是很小的

在我的主要剧本中,我所能做的就是:

indir = "D:\\basil\\input"
mdblist = createDeepMdbList(indir)
for infile in mdblist:
    processMdb(infile)
当按顺序执行时,它也能完美地执行

我尝试过使用并行Python:

ppservers = ()
job_server = pp.Server(ppservers=ppservers)

inputs = tuple(mdblist)
functions = (preparePointLayer, prepareInterTable, jointInterToPoint,\
          prepareDataTable, exportElemTables, joinDatatoPoint, exportToShapefile)
modules = ("sys", "os", "arcgisscripting", "string", "time")

fn = pp.Template(job_server, processMdb, functions, modules)
jobs = [(input, fn.submit(input)) for input in inputs]
它成功地创建了8个进程,8个地理处理器对象。。。然后失败了

我还没有对内置的Python多线程工具进行过广泛的实验,但我希望能得到一些指导,以便在mdblist表示的队列中生成多达8个进程。在任何时候,都不会尝试由多个进程同时写入或读取任何文件。为了使事情暂时变得简单,我也因为这个原因移除了所有的日志记录工具;我已经运行了这个脚本足够多的时间,知道除了4104输入的4个文件的数据格式稍有不同之外,它还能工作


建议?尝试使用多线程Arc Python脚本是否明智?

我想与大家分享一下最终对我有用的东西和我的经验

按照Joe的评论使用多处理模块(code.google.com/p/python multiprocessing)的后端口工作得很好。为了处理局部/全局变量和日志记录,我不得不改变脚本中的一些内容

主脚本现在是:

if __name__ == '__main__':

    indir = r'C:\basil\rs_Rock_and_Sediment\DVD_Data\testdir'
    mdblist = createDeepMdbList(indir)

    processes = 6  # set num procs to use here
    pool = multiprocessing.Pool(processes)

    pool.map(processMdb, mdblist)
使用6个过程,总时间从约36小时变为约8小时

我遇到的一些问题是,通过使用单独的进程,它们处理不同的内存堆栈,并将全局变量完全去掉。队列可以用于此目的,但我尚未实现此功能,因此所有内容都是在本地声明的

此外,由于pool.map只能接受一个参数,因此每次迭代都必须创建并删除地理处理器对象,而不能创建8个gp并向每次迭代传递一个可用的gp。每个迭代大约需要一分钟,所以创建它的几秒钟不是什么大问题,但是它加起来了。我没有做过任何具体的测试,但这实际上可能是一个很好的实践,因为任何使用过Arcgis和python的人都会知道,脚本会随着地理处理器激活时间的延长而急剧降低速度(例如,我的一个脚本被一位同事使用,他使输入过载,从运行1小时后的50小时到运行过夜后的350小时到运行2天后的800小时,估计完成的时间从50小时到350小时……它被取消,输入受限)


希望这能帮助其他希望多处理大型可写输入的人:)。下一步:递归、多处理的附件

我在同一函数中比较了上述方法。 结果是:

Starting pp with 1 workers
Time elapsed:  4.625 s

Starting pp with 2 workers
Time elapsed:  2.43700003624 s

Starting pp with 4 workers
Time elapsed:  2.42100000381 s

Starting pp with 8 workers
Time elapsed:  2.375 s

Starting pp with 16 workers
Time elapsed:  2.43799996376 s


您是否尝试过内置的
多处理
模块而不是并行python?它应该像
multiprocessing.Pool()一样简单;结果=pool.map(processMdb,文件列表)
。。。它应该与ArcGIS等一起使用,但我还没有真正尝试过。再说一次,我不记得Arc的任何版本是否附带了足够新的python版本,可以进行
多处理
。。。它只进入了python 2.6的标准库。对不起,应该提到版本。。。我目前使用的Arc 9.3被锁定为2.5。获得2.6版有一些变通方法,但报告尚未100%成功:。Arcmap 10对我来说是可用的,并且随2.6一起提供,但是它也改变了它使用的python模块,并且我一直在犹豫升级,因为我将不得不更新和测试许多旧脚本@JoeFor值得一提的是,Python2.5有一个多处理的后端口:我记得它有一些在2.6的标准库版本中不存在的问题,不过。。。我想这值得一试。。。不管怎样,祝你好运@乔-后端口工作难以置信!到目前为止,我没有发现任何打嗝/虫子。我终于可以在2x4核心数据处理机上使用超过12.5%的cpu了:)。这可能会改变Arc 10的规模,以实现本机多处理。谢谢你的帮助和链接。
Starting mul_pool with 1 p
Time elapsed:  5.31299996376 s

Starting mul_pool with 2
Time elapsed:  3.125 s

Starting mul_pool with 4
Time elapsed:  3.56200003624 s

Starting mul_pool with 8
Time elapsed:  4.5 s

Starting mul_pool with 16
Time elapsed:  5.92199993134 s