Viac

Optimalizácia Python GDAL ReadAsArray


Používam metódu GDAL ReadAsArray na prácu s rastrovými dátami pomocou numpy (konkrétne reklasifikácia). Pretože sú moje rastre veľké, spracovávam polia v blokoch, každý blok opakujem a proces opakujem podobnou metódou ako v príklade GeoExamples.

Teraz sa pozerám na to, ako najlepšie nastaviť veľkosť týchto blokov, aby sa optimalizoval čas potrebný na spracovanie celého rastra. Keď som si vedomý obmedzení s početnými veľkosťami polí a použitia GDAL GetBlockSize na použitie „prirodzenej“ veľkosti bloku rastra, testujem pomocou niekoľkých rôznych veľkostí blokov, ktoré sú zložené z násobkov „prirodzenej“ veľkosti, s príkladom kódu nižšie:

import timeit try: import gdal okrem: from osgeo import gdal # Funkcia na čítanie rastra ako polí pre zvolenú veľkosť bloku. def read_raster (x_block_size, y_block_size): raster = "cesta k veľkému rastru" ds = gdal.Open (raster) band = ds.GetRasterBand (1) xsize = band.XSize ysize = band.YSize bloky = 0 pre y v xrange ( 0, ysize, y_block_size): if y + y_block_size 

Ktorý produkuje nasledujúci druh výstupu:

474452 blokov veľkosť 256 x 16: 9,12 s 4930 blokov veľkosť 2560 x 160: 5,32 s 58 blokov veľkosť 25600 x 1600: 5,72 s 49181 blokov veľkosť 2560 x 16: 4,22 s 5786 blokov veľkosť 25600 x 16: 5,67 s 47560 blokov veľkosť 256 x 160: 4,21 s 4756 blokov veľkosť 256 x 1600: 5,62 s 2893 blokov veľkosť 41740 x 16: 5,85 s 164 blokov veľkosť 256 x 46280: 5,97 s 46280 blokov veľkosť 41740 x 1: 5,00 s 41740 blokov veľkosť 1 x 46280: 800,24 s

Pokúsil som sa to spustiť pre niekoľko rôznych rastrov s rôznymi veľkosťami a typmi pixelov a zdá sa, že dostávam podobné trendy, keď desaťnásobné zvýšenie rozmerov x alebo y (v niektorých prípadoch obidve) znižuje dobu spracovania na polovicu aj keď to nie je také dôležité vo vyššie uvedenom príklade, môže to znamenať počet minút pre moje najväčšie rastre.

Moja otázka teda znie, prečo k tomuto správaniu dochádza?

Očakával som, že na zlepšenie času spracovania použijem menej blokov, ale testy, ktoré používajú najmenej, nie sú najrýchlejšie. Prečo tiež trvá záverečný test toľko času ako pred ním? Existuje nejaká preferencia rastrov pre čítanie po riadkoch alebo stĺpcoch alebo v tvare čítaného bloku, celková veľkosť? Dúfam, že sa z toho dostanem, sú informácie na získanie základného algoritmu, ktorý bude schopný nastaviť veľkosť bloku rastra na optimálnu hodnotu v závislosti od veľkosti vstupu.

Všimnite si, že môj vstup je raster mriežky ESRI ArcINFO, ktorý má „prirodzený“ rozmer bloku 256 x 16 a celková veľkosť môjho rastra v tomto príklade bola 41740 x 46280.


Skúšali ste použiť rovnakú veľkosť bloku. Zaoberám sa rastrovými dátami, ktoré sú rádovo 200k x 200k pixelov a dosť riedke. Veľa testov prinieslo bloky 256x256 pixelov, ktoré sú pre naše procesy najefektívnejšie. To všetko súvisí s tým, koľko vyhľadávaní disku je potrebných na získanie bloku. Ak je blok príliš veľký, je ťažšie súvisle ho zapísať na disk, čo znamená viac hľadania. Rovnako tak, ak je príliš malý, budete musieť urobiť veľa čítaní, aby ste mohli spracovať celý raster. Pomáha tiež zabezpečiť, aby celková veľkosť bola mocninou dvoch. 256 x 256 je mimochodom predvolená veľkosť bloku geotiffu v gdal, takže možno vyvodili rovnaký záver


Moje podozrenie je, že skutočne narazíte na blokovú medzipamäť GDAL, a to je gombík, ktorý bude mať významný vplyv na vašu krivku rýchlosti spracovania.

Konkrétne si pozrite časť SettingConfigOptionsGDAL_CACHEMAX, aby ste získali viac podrobností a preskúmali, ako zmena tejto hodnoty na niečo podstatne väčšie interaguje s vašou simuláciou.


Pozri si video: Convert between CSV and GeoTIFF with GDAL in Python (Október 2021).