私はPythonスクリプトを用意しています。ハードコーディングされた入力ディレクトリに基づいて、すべての.mdbファイルをスキャンし、そのファイルをリストに入れてからforループ内ですべてを繰り返します。各反復には、複数のテーブル制限、結合、クエリなどが含まれます。Pythonを使用したArcGISでのマルチスレッド
唯一の問題...それは、入力データセット上で実行するのに約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つのgeoprocessorオブジェクトを成功し、その後、失敗しました。
私はPythonのマルチスレッドツールを使って広範囲に実験をしていませんが、mdblistが表すキューを8つまでプロセスを生成するだけのガイダンスを期待していました。どの時点でも、同時に複数のプロセスがファイルの書き込みや読み取りを試みることはありません。一時的に物事を簡単にするために、私はこの問題のためにすべてのログツールを削除しました。私はこのスクリプトを実行して、わずかに異なるデータ形式を持つ4104の入力の4つのファイルを除いて動作することを知りました。
アドバイス? Arc Pythonスクリプトをマルチスレッド化しようとする知恵?
があなたの代わりに、並列のpythonの組み込みの 'multiprocessing'モジュールを試してみましたか?これは、 'multiprocessing.Pool();と同じくらい単純でなければなりません。結果= pool.map(processMdb、filelist) '... ArcGISなどとはうまくいくはずですが、実際に試したことはありません。そして、Arcのバージョンのどれかが、 'multiprocessing'を持つのに十分な新しいバージョンのPythonを持っていれば、私は覚えていません。それはPython 2.6の標準ライブラリに入っただけです。 –
申し訳ありませんが、バージョンを言及しているはずです...私は現在2.5にロックされているArc 9.3を使用しています。 2.6を得るためのいくつかの回避策がありますが、レポートは100%成功していません:[link](http://gis.stackexchange.com/questions/2226/can-i-use-python-2-6-with- arcgis-9-3)。 Arcmap 10は私には使えますが、2.6と一緒に出荷されますが、Pythonモジュールも変更されています。更新とテストが必要な古いスクリプトがたくさんあるので、私はアップグレードすることを躊躇しています。 @Joe – BasilV
Python 2.5用のマルチプロセッシングのバックポートがあります:http://code.google.com/p/python-multiprocessing/標準ライブラリには存在しないいくつかの問題がありますしかし、2.6のバージョン...それは試してみる価値がある、と思います...幸運にも関係なく! –