Dla @Aaron, który zapytał:
Mam nadzieję znaleźć wersję gdalwarp odpowiedzi @ wwnick, która wykorzystuje opcję -multi do ulepszonych operacji wielordzeniowych i wielowątkowych
Nieznaczne zrzeczenie się odpowiedzialności
Wykorzystuje to gdalwarp
, chociaż nie jestem do końca przekonany, że będzie znaczny wzrost wydajności. Do tej pory byłem związany z operacjami wejścia / wyjścia - uruchomienie tego skryptu na dużym rastrze pocięcie go na wiele mniejszych części nie wydaje się bardzo obciążające procesor, więc zakładam, że wąskim gardłem jest zapisywanie na dysk. Jeśli planujesz jednoczesne ponowne wyświetlanie kafelków lub czegoś podobnego, to może się to zmienić. Istnieją wskazówki strojenia tutaj . Krótka gra nie przyniosła mi żadnej poprawy, a procesor nigdy nie wydawał się czynnikiem ograniczającym.
Poza zrzeczeniem się odpowiedzialności, oto skrypt, który posłuży gdalwarp
do podzielenia rastra na kilka mniejszych płytek. Może wystąpić pewna strata z powodu podziału podłogi, ale można temu zaradzić, wybierając odpowiednią liczbę płytek. Będzie to n+1
gdzie n
jest numer podzielić przez uzyskać tile_width
i tile_height
zmienne.
import subprocess
import gdal
import sys
def gdalwarp(*args):
return subprocess.check_call(['gdalwarp'] + list(args))
src_path = sys.argv[1]
ds = gdal.Open(src_path)
try:
out_base = sys.argv[2]
except IndexError:
out_base = '/tmp/test_'
gt = ds.GetGeoTransform()
width_px = ds.RasterXSize
height_px = ds.RasterYSize
# Get coords for lower left corner
xmin = int(gt[0])
xmax = int(gt[0] + (gt[1] * width_px))
# get coords for upper right corner
if gt[5] > 0:
ymin = int(gt[3] - (gt[5] * height_px))
else:
ymin = int(gt[3] + (gt[5] * height_px))
ymax = int(gt[3])
# split height and width into four - i.e. this will produce 25 tiles
tile_width = (xmax - xmin) // 4
tile_height = (ymax - ymin) // 4
for x in range(xmin, xmax, tile_width):
for y in range(ymin, ymax, tile_height):
gdalwarp('-te', str(x), str(y), str(x + tile_width),
str(y + tile_height), '-multi', '-wo', 'NUM_THREADS=ALL_CPUS',
'-wm', '500', src_path, out_base + '{}_{}.tif'.format(x, y))