我有一个 python 脚本,当它自己运行时效果很好。基于硬编码的输入目录,它扫描所有 .mdb 文件并将其放入列表中,然后在 for 循环中遍历它们。每次迭代都涉及多个表限制、连接、查询等。
唯一的问题.. 在输入数据集上运行大约需要 36 小时,虽然在这种情况下这个脚本只会用于这个数据集,但我想提高性能,因为我经常编辑字段选择,要包括的结果, join 方法等。我想说这需要很长时间,因为我的脚本效率低下,但任何低效率都会很小,因为几乎所有处理时间都专用于地理处理器对象。
我在主脚本中的相关内容是:
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 脚本的智慧?