使用Python在ArcGIS中进行多线程处理

Bas*_*ilV 4 python multithreading arcgis

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

唯一的问题..在输入数据集上运行大约需要36个小时,而这个脚本只会在这个实例中用于此数据集,我想提高性能,因为我经常编辑字段选择,结果包括,加入方法等我想说它需要很长时间,因为我的脚本效率低下,但任何低效率都会很小,因为几乎所有的处理时间都专用于地理处理器对象.

我在主脚本中的所有相关内容是:

indir = "D:\\basil\\input"
mdblist = createDeepMdbList(indir)
for infile in mdblist:
    processMdb(infile)
Run Code Online (Sandbox Code Playgroud)

它在顺序执行时也能完美执行.

我尝试过使用Parallel 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]
Run Code Online (Sandbox Code Playgroud)

它成功创建了8个进程,8个地理处理器对象......然后失败了.

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

建议吗?尝试多线程Arc Python脚本的智慧?

Bas*_*ilV 5

以为我会分享最终为我和我的经历工作的东西.

根据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)
Run Code Online (Sandbox Code Playgroud)

使用6个过程的总时间从~36小时变为~8.

我遇到的一些问题是,通过使用单独的进程,它们可以处理不同的内存堆栈并完全取出全局变量.队列可以用于此但我没有实现这一点所以一切都只是在本地声明.

此外,由于pool.map只能接受一个参数,因此每次迭代必须创建然后删除地理处理器对象,而不是能够创建8 gp并将每个迭代传递给可用的一个.每次迭代大约需要一分钟,因此创建它的几秒钟并不是什么大问题,但它会增加.我没有做过任何具体的测试,但实际上这可能是一个很好的做法,因为任何使用过Arcgis和python的人都知道脚本会大大减慢地理处理器活动的时间(例如,我的一个脚本被一个超载输入和时间估计完成的工人从运行1小时后的50小时到运行2天后过夜运行到800小时后的350小时......它被取消并且输入受限制).

希望能帮助其他任何想要多处理大量可输入输入的人:).下一步:递归,多处理附加!