Lấy mẫu raster hiệu quả hàng tỷ đa giác (hộp giới hạn)


8

Làm thế nào một raster có thể được tính toán hiệu quả (bằng Python), được cung cấp một tập hợp bao gồm hàng tỷ hộp giới hạn (đọc tuần tự từ một tệp) và cho rằng các giá trị raster cho mỗi ô sẽ cho số lượng các hộp giới hạn chồng lấp?

Đối với raster 4000 * 4000

Tôi đã hẹn giờ tạo ma trận numpy:

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

Tạo ma trận python chuẩn:

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

Vì vậy, numpy nhanh hơn, nhưng vẫn còn 50 msec mỗi vòng lặp, với một tỷ lần lặp, mang lại thời gian chạy bằng khoảng một năm (0,05msec * 1000000000/60/60/24/365 = 1,5 năm)

Vì vậy, nó không phải là một tùy chọn để lấy mẫu từng đa giác. Một cách tiếp cận điển hình cho vấn đề này là gì?


Tôi muốn giải quyết nó trên một máy tính, vì vậy không có giải pháp bản đồ / thu nhỏ nào vui lòng :-)
Pimin Konstantin Kefaloukos

2
Tôi không hiểu tầm quan trọng của các hoạt động tạo raster thời gian. Quá trình này cần phải tạo raster bên dưới chính xác một lần. Thống trị thời gian thực hiện sẽ là vấn đề tăng số lượng trong nội thất của các hộp giới hạn. Tất cả bạn phải làm là tối ưu hóa vòng lặp bên trong này. Nó có thể được thực hiện để đi cực kỳ nhanh chóng trong một ngôn ngữ được biên dịch như C hoặc Fortran.
whuber

Tạo một raster zero là xấp xỉ thô của tôi về thời gian cần thiết để tăng số đếm trong trường hợp xấu. Đó là một giới hạn thấp hơn về trường hợp xấu nhất mất bao lâu, trong đó đa giác có lớn như raster, ngôn ngữ được biên dịch hay không. Câu hỏi thực sự là, được đưa ra một raster 4000x4000, toàn bộ raster có thể tăng nhanh như thế nào trong C hoặc Fortran trên máy tính xách tay trung cấp, mặt sau của phong bì?
Pimin Konstantin Kefaloukos

2
Một BB xác định một phạm vi các hàng được lập chỉ mục bởi i0..i1 và một phạm vi các cột j0..j1. Trong lưu trữ theo từng hàng, bạn có thể tăng X (i, j0..j1) rất nhanh (đó là lưu trữ liền kề). Điều đó có thể được thực hiện với tốc độ khoảng 3E9 / giây và thậm chí là véc tơ nếu bạn muốn hoạt động nhanh hơn nhiều. Vòng lặp i từ i0 đến i1: chăm sóc một BB duy nhất. Đối với mỗi BB, bạn phải chuyển đổi tọa độ biên của nó thành (i0, i1, j0, j1), nhưng đó không phải là quá nhiều: nó có thể được thực hiện nhanh hơn bạn có thể đọc tọa độ.
whuber

1
Có một blog thú vị trên trang ESRI nói về việc sử dụng python và xử lý đa lõi, có thể giúp ích? blog.esri.com/esri/arcgis/2011/08/29/multiprocessing
Hornbydd

Câu trả lời:


2

Của bạn timeitbao gồm nhập numpy, mà sẽ thêm một số chi phí. Vậy tại sao bạn không viết mã cho một tập hợp con của các hộp giới hạn và thời gian vòng lặp đó, sau đó nhân nó lên để ước tính tổng thời gian chạy?

Việc giải quyết nó trên một máy tính là bản chất nối tiếp và với thao tác tương đối đơn giản, bạn có thể không nhận được bất kỳ tối ưu hóa đáng kể nào từ một thuật toán đơn giản. Bạn có thể thử chia nó thành một loại hoạt động thu nhỏ bản đồ thủ công (tôi biết bạn có một cảnh báo "không giảm bản đồ") và chạy nhiều trường hợp như bạn có lõi. Mosaicking / sáp nhập n raster (bước giảm) là một hoạt động nhanh chóng tầm thường. Điều này có lẽ sẽ ít gây đau đớn hơn so với giải pháp đa luồng.

Ngoài ra (hoặc thêm vào đó), bạn có thể viết một chương trình để kết hợp các hộp giới hạn nhất định như các hộp chồng chéo hoặc lồng nhau - điều này sẽ yêu cầu một chỉ số không gian. Nếu bạn không có, bạn có thể thấy việc tạo một lợi ích, đặc biệt nếu bạn kết thúc song song cục bộ thuật toán chính.

Ngoài ra, không loại bỏ song song nhiều máy tính ra khỏi tầm tay. Nếu ước tính tốt nhất của bạn là hơn một năm, thì bạn cần phải cộng thêm bao nhiêu thời gian của bạn để chạy phiên bản máy tính đơn lẻ và cân nhắc với việc thuê một số thời gian tính toán trên đám mây. Như @whuber nói, 1024 GPU sẽ kiểm tra dữ liệu rất nhanh, điều đó sẽ khiến bạn không mất gì, ngay cả khi bạn mất một tuần để đi vòng CUDA. Nếu đó là sếp của bạn cấm bạn thử nó trên nhiều máy tính, hãy phân tích chi phí và đưa cho anh ta một số số cứng - sau đó anh ta sẽ cân nhắc giá trị của dữ liệu so với giá trị thời gian của bạn.


1

Nếu tôi hiểu chính xác, những gì bạn muốn giống như hiển thị bộ hàng tỷ hộp giới hạn của bạn thành một hình ảnh. Ngoại trừ việc thay vì "vẽ" từng đa giác trên một ô (pixel) bạn đếm (hoặc tích lũy) chúng.

Bạn có thể sử dụng (tương đối) mã đơn giản (trong OpenGL, Vulcan, Direct3D) để hiển thị đa giác và tích lũy số lượng trong bộ đệm stpson. Hãy cẩn thận để đa giác rơi chính xác vào ranh giới pixel và chọn loại dữ liệu cho bộ đệm stpson để số lượng không bị tràn. Tôi hy vọng nó sẽ chạy trong vài giây trên một GPU ...

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.