4

単独で実行するとうまく機能する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 スクリプトをマルチスレッド化しようとする知恵はありますか?

4

2 に答える 2

5

私のために働いた結果と私の経験を共有したいと思いました。

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は1つの引数しかとることができないため、8つのgpを作成して使用可能なものを各反復に渡すのではなく、各反復でジオプロセッサオブジェクトを作成してから削除する必要があります。各反復には約1分かかるため、作成に数秒かかることは大したことではありませんが、合計すると加算されます。具体的なテストは行っていませんが、ArcgisとPythonを使用したことがある人なら誰でも、ジオプロセッサがアクティブである時間が長くなるほどスクリプトの速度が大幅に低下することを知っているので、これは実際には良い習慣です(たとえば、私のスクリプトの1つが共同で使用された入力と時間の見積もりを過負荷にして完了するまでの作業者は、1時間の実行時間の50時間後、夜間の実行後350時間、2日間の実行後800時間になりました...キャンセルされ、入力が制限されました)。

大量のイタブル入力をマルチプロセッシングしようとしている他の人に役立つことを願っています:)。次のステップ:再帰的なマルチプロセスの追加!

于 2011-02-21T19:27:59.010 に答える
-1

上記の方法を同じ関数で比較しました。結果:

Starting pp with 1 workers
Time elapsed:  4.625 s

Starting pp with 2 workers
Time elapsed:  2.43700003624 s

Starting pp with 4 workers
Time elapsed:  2.42100000381 s

Starting pp with 8 workers
Time elapsed:  2.375 s

Starting pp with 16 workers
Time elapsed:  2.43799996376 s

Starting mul_pool with 1 p
Time elapsed:  5.31299996376 s

Starting mul_pool with 2
Time elapsed:  3.125 s

Starting mul_pool with 4
Time elapsed:  3.56200003624 s

Starting mul_pool with 8
Time elapsed:  4.5 s

Starting mul_pool with 16
Time elapsed:  5.92199993134 s
于 2011-05-30T02:55:05.827 に答える