gpt4 book ai didi

python - ArcGIS 中的多线程与 Python

转载 作者:太空狗 更新时间:2023-10-30 03:07:22 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com