単独で実行するとうまく機能するPythonスクリプトがあります。ハードコーディングされた入力ディレクトリに基づいて、すべての .mdb ファイルをスキャンし、それをリストに入れ、for ループでそれらすべてを反復処理します。各反復には、複数のテーブル制限、結合、クエリなどが含まれます。
唯一の問題..入力データセットで実行するのに約 36 時間かかります。このスクリプトは、このインスタンスのこのデータセットに対してのみ使用されますが、フィールドの選択、含める結果を頻繁に編集するため、パフォーマンスを向上させたいと考えています。私のスクリプトは非効率的であるため、長い時間がかかると言いたいのですが、ほとんどすべての処理時間がジオプロセッサ オブジェクトに費やされるため、非効率性はわずかです。
メインスクリプトに関連するものは次のとおりです。
indir = "D:\\basil\\input"
mdblist = createDeepMdbList(indir)
for infile in mdblist:
processMdb(infile)
また、順次実行しても問題なく実行されます。
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]
8 つのプロセス、8 つのジオプロセッサ オブジェクトの作成に成功し、失敗します。
組み込みの Python マルチスレッド ツールを使って広範囲に実験したことはありませんが、mdblist によって表されるキューを通過する最大 8 つのプロセスを単純に生成するためのガイダンスを期待していました。ファイルが複数のプロセスによって同時に読み書きされようとすることは決してありません。一時的に簡単にするために、この懸念からすべてのログ ツールも削除しました。このスクリプトを十分な回数実行して、データ形式がわずかに異なる 4104 の入力の 4 つのファイルを除いて、機能することを確認しました。
アドバイス?Arc Python スクリプトをマルチスレッド化しようとする知恵はありますか?