Daugiau

Optimizuoti ir pagreitinti „ArcPy“ kodą?

Optimizuoti ir pagreitinti „ArcPy“ kodą?


Vėl mano paviršiaus nuotėkio linijos. Aš sukūriau scenarijų, išsprendžiau klausimą, kai linijos kerta kitas linijas. Kažkas panašaus į apibendrinimą. Kaip žemiau esančiame paveikslėlyje. Problema ta, kad turiu išspręsti 30 mln. šių eilučių. Aš išbandžiau jį ant 20 000 linijų, o bėgimui reikalingas laikas buvo 2 val. Apytiksliai, jei aš tai darysiu ištisus 30 milijonų linijų, bėgimui reikalingas laikas yra 5 - 6 mėnesiai.

Esu „Python“ pradedantysis.

Kaip galiu pakoreguoti scenarijų, kad jis būtų paleistas greičiau?

Aš naudoju Python 2.7.3, ArcGIS 10.2 ir Windows 7. Savo scenarijų įdėjau čia:

'

#IMPORT MODULIAI, NUSTATYMAI # ############################################################## ##################################### import arcpy, datetime start = datetime.datetime.now () arcpy.env .overwriteOutput = True arcpy.env.workspace = r "C:  Users  david  Desktop  GAEC  TEST  TEST1.gdb" # KINTAMųjų APIBRĖŽIMAS # ################# ######################################################## ############ OL = "OL" # Sluoksnis su linijomis OL_FC = "in_memory" + "" + "OL_FC" OL_buff = "in_memory" + "" + "OL_buff" memOne = "in_memory" + "" + "OL_one" memSelect = "in_memory" + "" + "memSelect" memErase = "in_memory" + "" + "OL_erase" memOut = "in_memory" + " "+" OL_out "memOutTemp =" in_memory "+"  "+" OL_outTemp "memDissolve =" in_memory "+"  "+" memDissolve "memSplit =" in_memory "+"  "+" memSplit "memUnsplit =" in_memory "+"  "+" memUnsplit "OL_final =" OL_final "# TESTAVIMO IR KŪRIMO SRITYS ATRB LENTELĖJE, PASKAIČIAVIMAS # ###################### ######################################################## ###### jei l lt (arcpy.ListFields (OL, "LENGTH"))> 0: spausdinti "Lentelėje jau yra laukas LENGTH! ..." dar: arcpy.AddField_management (OL, "LENGTH", "LONG") spausdinti "Missinf laukas LENGTH -> kuriama ... "arcpy.CalculateField_management (OL," LENGTH ","! shape.length! "," PYTHON ") spausdinti" Apskaičiuokite linijų ilgį ... ", jei len (arcpy.ListFields (OL," EDIT "))> 0: spausdinti "Lentelėje jau yra laukas REDAGUOTI! ..." arcpy.DeleteField_management (OL, "EDIT") arcpy.AddField_management (OL, "EDIT", "TRUMPAS") dar: arcpy.AddField_management (OL, "EDIT", "TRUMPAS" ) print "Missinf field EDIT -> Kuriant ..." arcpy.MakeFeatureLayer_management (OL, OL_FC) eilutės = arcpy.SearchCursor (OL_FC) sql = '"LENGTH" <' + str (10) ilgiai = sąrašas () ilgiai0 = sąrašas () i = 1 a = -1 # CIKLAS, SUDARYMAS ILGIŲ SĄRAŠĄ, NAUDOJAMAS LINIJŲ (CIKLŲ) SKAIČIUI # ############################ ######################################################## ## eilutėms eilutėse: x = row.getValue ("LENGTH") lengths.append (x) # VISOS PROGRAMOS CIKLAS # ######################## ############################ ############################## q (ilgiai): # LINIJŲ SKAIČIAVIMO ILGIS, PRIVALO ATNAUJINTI PRIEŽASTĮ, PRIEŽASTYS KEITAMOS0 eilutės0 = arcpy.SearchCursor (OL_FC )0 eilutėje0 eilutėse: x0 = row0.getValue ("LENGTH") ilgiai0.append (x0) ilgiai0.sort () # ############## ######################################################## ########## leng = lengths0 [a] # FAKTINĖS ILGOSIOS EILUTĖS PASIRINKIMAS, PRADEDANTIS SĄRAŠO Pabaigoje ir nusileidžiantis sql1 = '"ILGIS" =' + str (leng) arcpy.SelectLayerByAttribute_management (OL_FC "NEW_SELECTION", sql1) # ############################################################## ################################# curA = arcpy.SearchCursor (OL_FC) A eilutei curA: # TESTAVIMAS, JEJE LYGNOS REDAGUOTOS PRIEŠ (JEI TAIP, LAIKYKITE „REDAGUOTI“ = 1, TADA praleiskite) test0 = rowA.getValue („EDIT“), jei test0! = 1: # ################### ######################################################## ## arcpy.MakeFeatureLayer_management (OL_FC, memOne) print "Linija eksportuota į nepriklausomą sluoksnį" arcpy.Buffer_analysis (memOne, OL_buff, "1.3 Meters") spausdinti "C pastovus buferis aplink eilutę "arcpy.SelectLayerByLocation_management (OL_FC," INTERSECT ", OL_buff," "," NEW_SELECTION ") curAA = arcpy.UpdateCursor (OL_FC) w2 curAA: # UŽPILDYTI LAUKO REDAGAVIMĄ 1, NUSTATYTI LAIKĄ # ####################################################### ############# w2.setValue ("EDIT", 1) w2.setValue ("LENGTH", 0) curAA.updateRow (w2) arcpy.MakeFeatureLayer_management (OL_FC, memSelect) spausdinti "Eksportuoti" paveiktos eilutės "test = int (arcpy.GetCount_management (OL_FC) [0]) # TESTAVIMAS, JEJE LINE PALIEKIA MAŽiausiai VIENĄ KITĄ EILUT,, JEI NE, praleiskite # ################## #######################################################, jei testas! = 1: arcpy.Dissolve_management (memSelect, memDissolve) arcpy.Erase_analysis (memDissolve, OL_buff, memErase) arcpy.SplitLine_management (memErase, memSplit) arcpy.UnsplitLine_management (memSplit, memUsplit, memUnsplit) ) spausdinti „Sujungti su pradine eilute (kuri ištrina buferį)“ arcpy.Snap_edit (memOut, [[memOne, "EDGE", "1.4 Me ters "]]) print" LINIJOS PRIKLAUSOMOS IŠ ORIGINALIŲ LINIJŲ "# IŠTRINAMOS LINIJOS, KURIOS TRUMPESNĖS KAIP 10 M # ############################ ###################################### arcpy.MakeFeatureLayer_management (memOut, memOutTemp) arcpy.CalculateField_management (memOutTemp, "LENGTH", "! Shape.length!", "PYTHON") arcpy.SelectLayerByAttribute_management (memOutTemp, "NEW_SELECTION", sql) arcpy.DeleteFeatures_management (memOutTemp) spausdinti "Trumpesnės nei 10 m linijos" ištrintos mažiau EILUTĖS PRIDEDAMOS GALUTINIUOSE # ############################################################## ################# if i == 1: arcpy.CopyFeatures_management (memOutTemp, OL_final) else: arcpy.Append_management (memOutTemp, OL_final) print "Naujas sluoksnis pridedamas prie sluoksnio prieš "# LINIJOS NEKIRSTANT KITOS LINIJOS # ############################################## ########################### dar: w2 atveju curAA: w2.setValue ("EDIT", 1) w2.setValue ("LENGTH" , 0) arcpy.Append_management (OL_FC, OL_final) curAA.updateRow (w2) spausdinti „Stovas vien eilutė pridedama prie paskutinio sluoksnio "spausdinti". Įvestas i, i = "+ str (i) +" ... "# IŠTRINTI RAMIOS ATMINTIN# # ######################## ############################################# arcpy.Delete_management ("in_memory") # ĮSKAIČIUOTA Į KITĄ CIKLĄ # ################################################################# ############################### i + = 1 a- = 1 # IŠTRINTI PAGALBOS FILEDUS # ########## ######################################################## ### arcpy.DeleteField_management (memOutTemp, "LENGTH") arcpy.DeleteField_management (memOutTemp, "EDIT") # LAIKO PABAIGA # ####################### ######################################################## ###### end = datetime.datetime.now () print " nPradėti:" + start.strftime ("% Y-% m-% d% H:% M:% S") print "Scenarijaus pabaiga : "+ end.strftime ("% Y-% m-% d% H:% M:% S ")

Be naujo arcpy.da žymeklio naudojimo, taip pat norėčiau pasiūlyti:

  • Tame pačiame sluoksnyje turite daug skirtingų paieškos žymeklių. Pažiūrėkite, ar galite pašalinti kai kuriuos iš jų ir ištraukti atributus iš vieno ar dviejų
  • Pridėkite pridėjimo atributų rodyklę bet kuriame stulpelyje, pagal kurį pateikiate užklausą
  • Pažiūrėkite, ar galite pašalinti pažymėtą sluoksnį pagal atributų logiką ir pritaikyti tą užklausą žymeklio argumente where clause (tai pašalins daugybę įrašų, kurių nereikia kartoti)

Be atsakymų apie žymeklio keitimą ir jų skaičiaus mažinimą, galite tai šiek tiek lygiagrečiai naudoti naudodami antrinius procesus. „Python“ antriniai procesai apeina „Global Interpreter Lock“ (GIL) apribojimus - priešingai nei „Python“ daugialypiai siūlai (kitoks dalykas nei daugiaprocesinis). Nors „ArcGIS 10“ dabar naudoja daugiaprocesorinį procesą, manau, kad vis tiek turite aiškiai nurodyti „ArcPy“ tai padaryti ir atitinkamai sukurti savo antrinius procesus. Jūsų sukurtas skaičius yra pusiausvyros veiksmas. Pradėkite per daug ir jūs iš tikrųjų sulėtinsite reikalą. Vykdydama sunkiasvorio geoprocesoriaus užduotis, dirbu su antrinių procesų = branduolių -1 taisykle (vieną branduolį palieku „ArcGIS“ ir operacinei sistemai, o likusią dalį galite užkirsti savo procesu).

Taip pat galite sukurti geoprocesoriaus ūkį ir paspausti daugelį mašinų. Yra būdas tai padaryti su viena „ArcGIS“ kopija, tačiau ji patenka į programinės įrangos licencijos sutarties „pilką zoną“. Aš tai dariau praeityje, turėdamas ESRI žinių ir susidomėjimo (sudeginau maždaug 50 branduolių maždaug 20 mašinų), bet jūs turite būti atsargūs dėl savo teisėtos vietos !.

Jūsų alternatyva būtų atkurti procesą naudojant „FOSS4G“ programinę įrangą ir paspausti kuo daugiau mašinų tinkle, vykdant užduotį. Atsižvelgiant į laiko skalę, apie kurią kalbate, gali tekti apsvarstyti šią parinktį, jei siūlomi pakeitimai ir keli vietiniai paprocesai nesuteiks jums reikalingo greičio.

REDAGUOTI Daugiafunkcinio apdorojimo „Python“ dokumentacijos ieškokite čia. Tiesiog būkite atsargūs, jei tarp v2.x ir 3.x yra kokių nors pokyčių!


Visiems žymekliams perjunkite į arcpy.da. Senieji „arcpy“ žymeklio objektai sulūžo 10,1 sp2 greičiu ir vienintelis būdas, kuriuo ESRI galėjo tai ištaisyti, buvo sukurti naujus „arcpy.da“ žymeklio objektus.

Aš turėjau procesą, kuris vyko 10.1 sp1, kuris užtruko 18 valandų naudojant senus žymeklio objektus. Po sp2 praėjo daugiau nei 12 dienų, kol aš jį nužudžiau. Naujieji arcpy.da žymekliai trunka 4 valandas.


Be pirmiau pateiktų pasiūlymų, taip pat siūlyčiau paprastų kilpų atveju naudoti sąrašo supratimą. Pavyzdžiui:

eilutės = arcpy.SearchCursor (OL_FC) eilutėms eilutėse: x = row.getValue ("LENGTH") lengths.append (x)

Pakeisti į:

ilgiai = [line.getValue ("LENGTH") eilutei arcpy.SearchCursor (OL_FC)]

Duomenų saugojimo tarp daugelio duomenų saugyklų optimizavimas

Pateikiamos duomenų saugojimo optimizavimo tarp daugybės duomenų saugyklų mašinos ir metodai. Šis metodas apima duomenų užklausos, pateiktos saugoti duomenis vienoje ar daugiau duomenų saugojimo laikmenų, apdorojimą, nustatant, ar duomenų kopijos turi būti laikomos daugiau nei vienoje laikmenoje, kad būtų laikomasi nustatytų paslaugų kokybės reikalavimų, ir tvarkant duomenų kopijas. duomenys apie minėtą vieną ar daugiau duomenų saugojimo laikmenų, kad būtų patenkinti nustatyti paslaugų kokybės reikalavimai, tuo tarpu teikiant duomenų užklausą.


Žiūrėti video įrašą: Amazon SageMaker와 CDK를 활용한 딥러닝 모델 서비스 현대화 기법 최권열:: AWS Innovate 2021