OGR / GDALスレッドにより、コア使用率が低くなります


13

ogr / gdalを使用していくつかのラスターデータを処理しようとしていますが、マシンのすべてのコアを最大限に活用できないようです。単一のコアでのみプロセスを実行すると、そのコアの使用率が100%になります。マルチコアに分割しようとすると(以下の例では、xオフセットをチャンクしてキューに入れることにより)、8つのコアのそれぞれで哀れな使用率が得られます。各コア全体で最大100%の使用率(たとえば、各12.5%)にしかならないようです。

同じデータソースを使用することがボトルネックになるのではないかと心配していましたが、コアごとに基になるラスターファイルを複製しました... これは、ogrまたはgdalが何らかの形でボトルネックの共有リソースのように動作していると信じるようになりますが、それについてはオンラインで見つけることができません。どんな助けでも大歓迎です!

これは、各ワーカースレッド内で実行される「ヘルパー」関数です。

def find_pixels_intersect_helper(datasource, bounds_wkt, x_min, x_max):
    bounds = ogr.CreateGeometryFromWkt(bounds_wkt)
    rows_to_write = []
    for x_offset in range(x_min, x_max):
        for y_offset in range(datasource.RasterYSize):
            pxl_bounds_wkt = pix_to_wkt(datasource, x_offset, y_offset)
            pxl_bounds = ogr.CreateGeometryFromWkt(pxl_bounds_wkt)
            if pxl_bounds.Intersect(bounds):
                rows_to_write.append(['%s_%s' % (x_offset, y_offset), pxl_bounds.Centroid().ExportToWkt()])

可能性は低いですが、メモリがボトルネックになっているかどうかを確認しましたか?
lynxlynxlynx

@lynxlynxlynx-はい メモリは間違いなくボトルネックではありません。一日中このことを追跡しようとしています...これはかなり奇妙です。
マックス

使用しているラスタドライバが、一度に複数のスレッドから呼び出されるように設計されていない可能性があります。参照:mail-archive.com/gdal-dev@lists.osgeo.org/msg07283.html
blah238

回答:


10

OK。それは私が二度と戻れない私の人生の日でした。上記のコードに問題がなかったことが判明しました。それはまったく問題ありません。これはthreading.Threadとmultiprocessing.Processの場合であることがわかりました。

Pythonドキュメントで指摘されているように:

マルチプロセッシングパッケージは、ローカルとリモートの両方の同時実行性を提供し、スレッドの代わりにサブプロセスを使用してグローバルインタープリターロックを効果的に回避します。このため、マルチプロセッシングモジュールにより、プログラマーは特定のマシンで複数のプロセッサを完全に活用できます。

したがって、threading.ThreadはIO集中型の操作用であり、multiprocessing.ProcessはCPU集中型の操作用です。multiprocessing.processに切り替えて、すべてがうまく機能しました。

multiprocessing.Processの使用方法については、このチュートリアルご覧ください。


私はちょうどあなたが使用している実装(サードパーティの実装もあります)を確信していなかったことを示唆するつもりでした:)私は最近、ここをきちんとした建物の影ツールを高速化するために使用しました:Port "Producing Building Shadows" Avenue ArcGIS 10へのコード
blah238

+1私はあなたがGDAL-devメーリングリストに一言あるべきだと投稿しようとしていた。しかし、私はあなたがそうしなかったことを今嬉しく思います!これは将来の参考のために削除されています。
MerseyViking

FWIW(おそらくそれほどではない)、私は人々がグローバルインタープリターロック(GIL)問題を解決しようとするために資金を集めているところを読んだ。3.x向けになると思います。
canisrufus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.