To dość ogólne pytanie. Zastanawiam się tylko, jakich wskazówek i trików użyli programiści GIS, aby przyspieszyć skrypty Arcpy, które importujesz do zestawu narzędzi i uruchamiasz.
Codziennie pracuję, pisząc małe skrypty, aby pomóc użytkownikom spoza GIS w moim biurze przetwarzać dane GIS. Przekonałem się, że przetwarzanie ArcGIS 10.0 jest ogólnie wolniejsze niż 9.3.1, a czasem staje się jeszcze wolniejsze po uruchomieniu skryptu python.
Wymienię konkretny przykład skryptu, którego uruchomienie zajmuje ponad 24 godziny. Jest to pętla, która tabelaryzuje obszar rastra w buforze dla każdego kształtu w buforze. Bufor ma około 7000 kształtów. Nie wierzę, że powinno to trwać tak długo. ZA
while x <= layerRecords:
arcpy.SetProgressorLabel("Tabulating Row: " + str(x) + " of " + str(ELClayerRecords))
arcpy.SelectLayerByAttribute_management(Buff,"NEW_SELECTION", "Recno = " + str(x)) # Selecting the record
TabulateArea(Buff, "Recno", MatGRID, "VALUE", ScratchWS + "/tab" + str(z) +".dbf", nMatGRIDc) # Tabulate the area of the single row
arcpy.AddMessage (" - Row: " + str(x) + " completed")
x = x + 1
z = z + 1
Zanim ktokolwiek to powie, uruchomiłem obszar tabelaryczny na całym buforze, ale powoduje błędy, jeśli działa na więcej niż jednym rekordzie. To wadliwe narzędzie, ale muszę go użyć.
W każdym razie, jeśli ktoś ma jakieś pomysły na optymalizację lub przyspieszenie tego skryptu, byłoby to bardzo mile widziane. W przeciwnym razie, czy masz jakieś sztuczki przyspieszające dla Pythona, gdy jest używane w ArcGIS?
źródło
Ogólne techniki optymalizacji Pythona mogą zaoszczędzić znaczną ilość czasu.
Jedną z naprawdę dobrych technik uzyskiwania informacji o tym, gdzie są błędy w skrypcie, jest użycie wbudowanego modułu cProfile:
Testowanie przy użyciu niewielkiej próbki danych pozwoli ci określić, które wywołania funkcji zajmują najwięcej czasu.
Ogólne wskazówki dotyczące szybszego kodu python:
Jeśli chodzi o twój skrypt, nie mogę komentować aspektów ArcPy, ponieważ nie mam Arc zainstalowanej na tym komputerze, ale możesz spróbować użyć pętli for zamiast pętli while, aby sprawdzić, czy coś to poprawi. Również x = x + 1 można zapisać jako x + = 1:
źródło
Upewnij się, że piszesz na wewnętrzny dysk komputera. Dotarcie do sieci, gdy nie jest to konieczne, może naprawdę spowolnić przetwarzanie. Kopiowanie danych może być nawet szybsze jako pierwszy krok w procesie, aby kolejne zapisy do odczytu były jak najszybsze
Uruchomienie skryptu całkowicie poza ArcMap może być znacznie szybsze. Jeśli mapa nie jest wymagana podczas przetwarzania, nie używaj ArcMap.
źródło
Calculate Value
oknie dialogowym) będzie przetwarzane szybciej niż uruchomienie tego samego skryptu z okna ArcPy w ArcMap. To jednak czysto anegdotyczne spostrzeżenie.To może nie odpowiedzieć na twoje pytanie dotyczące uruchamiania narzędzi ArcPy w ArcMap, ale kiedy muszę wykonać mięsiste przetwarzanie za pomocą narzędzi do geo-przetwarzania i Pythona, zwykle uruchamiam je poza systemem GIS za pomocą PyEcriptera IDE . Odkryłem, że działa szybciej. Użyłem również RAMDISK dla małych tymczasowych zbiorów danych wyjściowych (trochę jak obszar roboczy in_memory )
Cóż, to moje najlepsze wskazówki! :)
źródło
Spróbuj skomentować arcpy.SetProgressorLabel i zobacz, jak bardzo przyspieszysz. Przekonałem się, że każde wyjście ekranu, wracając do oszałamiającego DOS, drastycznie spowalnia czas przetwarzania. Jeśli naprawdę potrzebujesz zobaczyć ten wynik, spróbuj wyświetlić go w każdej pętli N-tej.
źródło
Upewnij się, że usuwasz wszystkie
import xxxx
nieużywane linie.(tzn. jeśli jeszcze nie korzystasz z żadnych funkcji matematycznych,
import Math
ładowanie skryptu zajmie trochę czasu)Chociaż nie będzie to miało wielkiego wpływu na uruchamiane pojedyncze skrypty (takie jak twoje), wpłynie to na wszystkie skrypty, które są uruchamiane często i powtarzalnie.
źródło
import Math
był prawdopodobnie złym przykładem. Jednak załadowanie niektórych większych bibliotek ArcPy zajmuje dużo czasu.