python - ArcGIS 中的多线程与 Python

标签 python multithreading arcgis

我有一个 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 多线程工具进行广泛的试验,但希望得到一些指导,以简单地生成多达 8 个进程,这些进程通过 mdblist 表示的队列。在任何时候,多个进程都不会尝试同时写入或读取任何文件。由于这个问题,为了暂时简化事情,我还删除了所有日志记录工具;我已经运行此脚本足够多次,知道它可以正常工作,但 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 小时......它被取消并且输入受限)。

希望这能帮助任何其他希望对大型可迭代输入进行多处理的人 :)。下一步:递归、多进程追加!

关于python - ArcGIS 中的多线程与 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4893809/

相关文章:

java - 客户端加锁是否违反了同步策略的封装?

javascript - ArcGIS 圆缓冲区

python - ArcGIS Python : Using Calendars in the Graphical Interface Forms

python - 根据另一个列表随机替换字典列表中的元素

python - 处理协议(protocol)、延迟和命令行输入

python - 如何将后面所有值的某些值移动到另一列

java - 如何将任务放回到ThreadPoolExecutor的BlockingQueue中?

Java jdbc Sql Server 并行写入

javascript - 使用 json 调用 ArcGIS 服务的 AJAX 无法正常工作

javascript - Django 1.2.3 - 国际化 - makemessages 不检测所有字符串