数十億のポリゴン(バウンディングボックス)の効率的なラスターサンプリング


8

何十億ものバウンディングボックス(ファイルから順番に読み込まれる)で構成されるセットが与えられ、各セルのラスター値が重複するバウンディングボックスの数を与える必要がある場合、ラスターを効率的に(Pythonで)計算するにはどうすればよいですか?

4000 * 4000ラスターの場合

私はnumpy行列の作成に時間をかけました:

$ python -m timeit 'import numpy' 'a = numpy.zeros(shape=(4000,4000))'
10 loops, best of 3: 51.7 msec per loop

標準のPython行列の作成:

$ python -m timeit 'a = 4000*[0]' 'for i in range(4000):' ' a[i]=4000*[0]'
10 loops, best of 3: 218 msec per loop

したがって、numpyはより高速ですが、ループあたり50ミリ秒、10億回の反復により、実行時間は約1年(0.05ミリ秒* 1000000000/60/60/24/365 = 1.5年)になります。

したがって、各ポリゴンをサンプリングすることはできません。この問題の典型的なアプローチは何ですか?


私は単一のコンピューターでそれを解決したいので、map / reduceソリューションはありません:-)
Pimin Konstantin Kefaloukos

2
ラスタ作成操作のタイミングの重要性がわかりません。このプロセスでは、基になるラスターを1回だけ作成する必要があります。実行時間を支配することは、バウンディングボックスの内部でカウントをインクリメントすることの問題になります。あなたがしなければならないのは、この内部ループを最適化することだけです。CやFortranのようなコンパイル済み言語では、非常に迅速に処理することができます。
whuber

ゼロラスタを作成することは、悪い場合にカウントをインクリメントするのにかかる時間の大まかな概算です。これは、ポリゴンがラスター、コンパイル済み言語であるかどうかに関係なく、最悪の場合にかかる時間の下限です。本当の問題は、4000x4000のラスターが与えられた場合、ラスター全体をCまたはFortranで中間レベルのラップトップのエンベロープの後ろにどれだけ速くインクリメントできるでしょうか?
Pimin Konstantin Kefaloukos

2
BBは、i0..i1でインデックス付けされた行の範囲と列j0..j1の範囲を決定します。行ごとのストレージでは、X(i、j0..j1)を非常に迅速にインクリメントできます(連続したストレージです)。これはおそらく、3E9のインクリメント/秒程度で実行でき、さらに高速な操作が必要な場合はベクトル化することもできます。i0からi1までiをループします。これにより、1つのBBが処理されます。各BBについて、境界座標を(i0、i1、j0、j1)に変換する必要がありますが、それはそれほどオーバーヘッドではありません。座標を読み取るよりも速く実行できます。
whuber

1
この興味深いブログがESRIサイトにあり、Pythonとマルチコア処理の使用について話していますが、役に立ちますか?blogs.esri.com/esri/arcgis/2011/08/29/multiprocessing
Hornbydd

回答:


2

あなたは、timeitいくつかのオーバーヘッドを追加しますnumpyの輸入を、含まれています。それでは、境界ボックスのサブセットのコードを記述し、ループの時間を計ってから、それを乗算して、合計実行時間を推定してみませんか?

単一のコンピューターでそれを解決することは、本質的にシリアルであり、比較的単純な操作では、すでに単純なアルゴリズムから大きな最適化を得ることができない可能性があります。ある種の手動のmap-reduce操作(「map-reduceがない」という警告があることは知っています)で分割して、コアの数と同じ数のインスタンスを実行してみてください。n個のラスターのモザイク化/マージ(縮小ステップ)は、非常に高速な操作です。これは、マルチスレッドソリューションよりもコードの苦痛が少ないでしょう。

代わりに(または追加で)、重複したボックスやネストされたボックスなどの特定のバウンディングボックスを組み合わせるプログラムを作成することもできます。これには空間インデックスが必要になります。ない場合は、特にメインアルゴリズムをローカルで並列化する場合に、1つ作成すると有益な場合があります。

また、手元にない複数のコンピューターの並列化を無視しないでください。最善の見積もりが1年を超える場合は、単一のコンピュータバージョンを実行するのにかかる費用を合計し、クラウドコンピューティングに費やす時間と比較する必要があります。@whuberが言うように、1024のGPUはデータを非常に迅速に処理するので、CUDAに1週間費やしても、コストはほとんどかかりません。上司が複数のコンピューターでそれを試すことを禁止している場合は、コスト分析を行い、いくつかの明確な数値を渡してください。その上で、データの価値とあなたの時間の価値を比較検討します。


1

私が正しく理解していれば、何十億ものバウンディングボックスのセットを画像にレンダリングするようなものです。セル(ピクセル)の上に各ポリゴンを「ペイント」する代わりに、それらを数える(または累積する)ことを除きます。

(比較的)単純なコード(OpenGL、Vulcan、Direct3D)を使用して、ポリゴンをレンダリングし、ステンシルバッファーにカウントを蓄積できます。ポリゴンが正確にピクセル境界に収まるように注意し、カウントがオーバーフローしないようにステンシルバッファーのデータタイプを選択してください。1つのGPUで数秒で実行されると思います...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.