Kết quả luồng OGR / GDAL trong việc sử dụng lõi thấp


13

Tôi đang cố xử lý một số dữ liệu raster bằng ogr / gdal và dường như tôi không thể sử dụng hết tất cả các lõi trên máy của mình. Khi tôi chỉ chạy quy trình trên một lõi đơn, tôi sẽ sử dụng 100% lõi đó. Khi tôi cố gắng phân chia thành đa lõi (trong ví dụ dưới đây, bằng cách chia nhỏ các x offset và đặt chúng vào hàng đợi), tôi nhận được việc sử dụng thảm hại trên mỗi 8 lõi của mình. Có vẻ như nó chỉ bổ sung tối đa 100% mức sử dụng trên mỗi lõi (ví dụ 12,5% cho mỗi lõi).

Tôi lo ngại rằng việc sử dụng cùng một nguồn dữ liệu là nút cổ chai, nhưng sau đó tôi đã sao chép tệp raster bên dưới cho mỗi lõi ... và việc sử dụng lõi vẫn còn tào lao. Điều này khiến tôi tin rằng ogr hoặc gdal bằng cách nào đó hành xử giống như một tài nguyên chia sẻ tắc nghẽn nhưng tôi không thể tìm thấy bất cứ điều gì trực tuyến về điều đó. Bất kì sự trợ giúp nào đều được đánh giá cao!

Đây là chức năng "trợ giúp" chạy bên trong mỗi luồng Công nhân:

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()])

Không thể, nhưng bạn đã kiểm tra xem bộ nhớ có phải là nút cổ chai không?
lynxlynxlynx

@lynxlynxlynx - vâng. Bộ nhớ chắc chắn không phải là nút cổ chai. Đã cố gắng theo dõi điều này suốt cả ngày ... điều này khá kỳ lạ.
Tối đa

Có thể là trình điều khiển raster mà bạn đang sử dụng đơn giản là không được thiết kế để được gọi từ nhiều hơn một luồng cùng một lúc. Tham khảo: mail-archive.com/gdal-dev@lists.osgeo.org/msg07283.html
blah238

Câu trả lời:


10

ĐỒNG Ý. Đó là một ngày của cuộc đời tôi mà tôi sẽ không bao giờ trở lại. Hóa ra vấn đề không nằm ở đoạn mã tôi đã đăng ở trên. Điều đó hoàn toàn tốt. Hóa ra đây là một trường hợp xâu chuỗi. Đọc so với đa xử lý.Process.

Như đã chỉ ra trong tài liệu về python :

Gói đa xử lý cung cấp cả đồng thời cục bộ và từ xa, bước hiệu quả bên cạnh Khóa phiên dịch toàn cầu bằng cách sử dụng các quy trình con thay vì các luồng. Do đó, mô-đun đa xử lý cho phép lập trình viên tận dụng triệt để nhiều bộ xử lý trên một máy nhất định

Do đó, phân luồng.Thread dành cho các hoạt động chuyên sâu IO, đa xử lý.Process dành cho các hoạt động chuyên sâu của CPU. Tôi đã chuyển sang đa xử lý. Xử lý và mọi thứ hoạt động tuyệt vời.

Hãy xem hướng dẫn này để tìm hiểu cách sử dụng đa xử lý. Xử lý


Tôi chỉ đề nghị rằng, tôi không chắc là triển khai nào (cũng có triển khai của bên thứ 3 ) mà bạn đang sử dụng :) Tôi đã sử dụng gần đây để tăng tốc một công cụ tạo bóng gọn gàng ở đây: Cổng Port Sản xuất Xây dựng Shadows Nott Avenue mã tới ArcGIS 10
blah238

+1 Tôi chuẩn bị đăng bài rằng bạn nên có một từ trong danh sách gửi thư GDAL-dev; Nhưng bây giờ tôi hài lòng bạn đã không! Điều này đã được thu thập để tham khảo trong tương lai.
MerseyViking

FWIW (có lẽ không nhiều lắm), tôi đã đọc ở đâu đó mọi người đang thu tiền để cố gắng khắc phục sự cố khóa phiên dịch toàn cầu (GIL). Tôi nghĩ rằng nó sẽ dành cho 3.x.
canisrufus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.