Meningkatkan kecepatan skrip Python menggunakan arcpy


8

Pembaruan 4/11/2014

Sepertinya skrip mulai terputus pada alat Hapus Fitur, jadi saya beralih ke Truncate Table, seperti yang disarankan dalam jawaban di bawah ini. Saya juga menghapus variabel yang tidak digunakan dari alat append.

Pembaruan 4/10/2014

Saya menjalankan skrip ini di komputer rekan kerja saya (mesinnya memiliki lebih banyak memori DAN mengandung ArcGIS 10.0 / Python26) dan itu berjalan dengan cepat. Hore! Setelah dukungan teknis saya menemukan CD ArcGIS 10.0, saya akan menginstal dan menguji untuk melihat apakah itu meningkatkan kecepatan pada mesin saya. Agar jelas, kami menjalankan skrip yang sama, drive jaringan dan koneksi database kami dipetakan secara identik, dan pernyataan cetaknya sama. Saya akan memposting pembaruan di sini setelah itu terjadi.

Akhiri pembaruan

Saya perlu meningkatkan kecepatan beberapa skrip Python yang melakukan pembaruan pada database Oracle. Saya memiliki skrip Python ini berjalan dengan baik selama + tahun, melalui tugas yang dijadwalkan dan file batch untuk memulai skrip. Minggu lalu saya pindah dari XP ke mesin Windows 7 dan ArcGIS 10.0 -> 10.1. Sejak saat itu skrip menjadi sangat lambat. Jika saya menjalankan skrip ini menggunakan kelas fitur kecil (berisi ~ 20 fitur) itu berjalan dalam 30 detik. Jika saya menggunakan kelas fitur menengah (~ 80.000 catatan) ini berjalan dalam 15 menit. Kelas fitur yang benar-benar saya butuhkan untuk dapat mentransfer dengan cepat berisi sekitar 1.000.000 catatan - skrip hanya sejauh pernyataan cetak untuk memeriksa apakah file ada (jika pernyataan dalam kode di bawah). Proses ini akan memakan waktu hanya 35 menit untuk menyelesaikan pada mesin XP / ArcGIS 10.0 saya.

Di bawah ini adalah kode sederhana yang telah saya uji. Adakah yang punya saran tentang apa yang bisa saya lakukan untuk meningkatkan kecepatan? Terima kasih, Patty

import arcpy, os, sys
from arcpy import env
arcpy.env.overwriteOutput = True
from datetime import datetime
import smtplib
import string
import urllib

#Define variables
inWorkspace = "O:/LANDING_PAD/BOE/example.gdb" 
lpFeatures = inWorkspace + os.sep + "fc1"
outWorkspace =  "Database Connections\\THIS.sde"
arcpy.env.workspace = outWorkspace
workspace = ""
copyFC = outWorkspace + os.sep + "SDE.fc1_1" #The feature class the script will update via delete and append
schema_type = "NO_TEST"
fieldMappings = ""
subtype = ""
t = datetime.now()
print "This script began at: " + str(t)

if arcpy.Exists(lpFeatures) is True and arcpy.Exists(copyFC) is True:
    print "Both files exist. Beginning delete..."
    arcpy.DeleteFeatures_management(copyFC) #(copyFC)

    print "ALL DONE DELETING!"

    arcpy.Append_management(lpFeatures, copyFC, schema_type, fieldMappings, subtype) #Append data from landing pad to db
    print "ALL DONE APPENDING!"
    record_count = arcpy.GetCount_management(lpFeatures)
    print record_count
    r = datetime.now()
    print "This script ended at: " + str(r)

1
Saya belum pernah menggunakan arcpy, tetapi saya telah menulis beberapa Python dan banyak sistem paralel di C #. Mungkinkah Anda bisa memecah pekerjaan Anda menjadi potongan-potongan kecil dan mengerjakannya secara paralel? Entah mengirim beberapa proses Python atau mencoba menggunakan threading. Ini bisa menjadi berantakan, terutama jika arcpy tidak aman, tetapi mungkin terbayar ketika Anda memiliki banyak hal yang harus dilakukan! Mungkin membantu untuk menanyakan tentang Stack Overflow juga.
jocull

Kelambatan ini karena Anda menghapus semua fitur individual dan menambahkan ke kelas fitur yang dikosongkan. Apakah ada alasan Anda tidak dapat menghapus seluruh kelas fitur Delete_management()dan kemudian membuatnya kembali dengan CopyFeatures_management()atau FeatureClassToFeatureClass_conversion()?
nmpeterson

2
Sudahkah Anda melakukan profil ( docs.python.org/2/library/profile.html ) untuk menentukan di mana sebagian besar pemrosesan Anda terjadi? Akan menarik melihat hasil Anda.
Aaron

1
@ jocull ya, saya sudah berpikir tentang menyusun sesuatu yang menggunakan multiprosesor, tapi saya agak terjebak pada bagaimana skrip begitu cepat pada XP / ArcGIS 10.0 saya, dan lambat pada Windows 7 / 10.1. Aaron, ya, akan sangat menyenangkan untuk melihat di mana pemrosesan terjadi, saya akan melihat ke dalam profiling script. Terima kasih, patty
Patty Jula

Saya memposting pembaruan di atas. Pada dasarnya, skrip berjalan cepat di mesin rekan kerja saya yang bagus.
Patty Jula

Jawaban:


7

Saya ingin berkomentar dulu, tapi kemudian rasanya lebih tepat untuk membungkusnya menjadi jawaban (meskipun mungkin tidak lengkap).

Saya telah menjalankan kode Anda di komputer saya (laptop perangkat keras teratas dengan SSD) menambahkan kelas fitur file geodatabase ke kelas fitur geodatabase SQL Server pada mesin yang sama yang membutuhkan waktu sekitar 13 menit. Saya tidak dapat memberi tahu Anda dengan pasti mengapa kecepatan eksekusi sangat berbeda di lingkungan Anda (10.0 >> 10.1), tetapi Anda telah meminta saran tentang apa yang dapat Anda lakukan untuk meningkatkan kecepatan , jadi di sini ada beberapa ide yang dapat meningkatkan kecepatan menjalankan skrip.

1) Saya menjalankan skrip dari baris perintah yang setara dengan menjalankan file bat. (Saya menjalankan skrip dalam rasa 64-bit, saya telah menginstal ArcGISx6410.2 64bit Python).

c:\Python27\ArcGISx6410.2\python.exe c:\scripts\appendfc.py

Dari pengalaman saya, umumnya lebih cepat menjalankan versi Python 64bit untuk menjalankan operasi GP yang panjang dan berat seperti Tambah. Jadi, Anda ingin memastikan Anda menjalankan versi Python ini saat menjalankan skrip.

2) Saya tidak akan merekomendasikan menggunakan arcpy.DeleteFeatures_management; ini jauh lebih lambat daripada menjalankan Truncate Table karena yang terakhir tidak menggunakan transaksi database yang meningkatkan kinerja dari penghapusan baris-demi-baris.

Anda menyebutkan bahwa skrip hanya berjalan sejauh pernyataan cetak untuk memeriksa apakah file ada (jika pernyataan dalam kode) . Ada kemungkinan besar bahwa itu terus menghapus baris demi baris yang mungkin merupakan proses yang sangat lambat ketika Anda mengakses tabel di database Oracle (atau benar-benar DBMS) jarak jauh. Coba jalankan skrip dengan Truncate Table, tetapi tanpa Append terlebih dahulu hanya untuk melihat perbedaan kinerja pada tahap penghapusan.

3) Anda tampaknya menggunakan "Database Connections\\THIS.sde"kode. Namun lebih baik untuk merujuk ke file koneksi itu sendiri (file .sde) dengan sistem file atau jalur UNC, bukan jendela katalog "Koneksi Database" folder. Anda dapat mengakses file .sde yang dibuat di C:\Users\%user%\AppData\Roaming\ESRI\Desktop10.1\ArcCatalog. Anda dapat memindahkan file .sde ini sesuai kebutuhan dan menempatkannya di folder yang dapat diakses oleh skrip Python.

4) Dalam arcpy.Append_managementfungsi ini, Anda menggunakan beberapa parameter kosong. Secara teori, seharusnya tidak ada bedanya, tapi saya sarankan menjalankan fungsi tanpa menentukan parameter itu hanya karena Anda tidak membutuhkannya. Anda tidak pernah tahu apa yang terjadi di balik layar dan apakah senar kosong itu dievaluasi di beberapa titik dan apakah ini dapat memengaruhi kinerja. Ikuti saja arcpy.Append_management(lpFeatures, copyFC, schema_type)dan jangan tentukan parameter yang tidak Anda berikan nilai apa pun.

5) Saya tidak suka menggunakan os.sepketika membangun jalur ke kelas fitur. Gunakan os.path.join(geodatabase,featureclassname)untuk itu sebagai gantinya. Itu lebih bersih dan lebih mudah dibaca.

Anda dapat menambahkan rincian lebih lanjut ke pertanyaan setelah Anda mencoba hal-hal di atas dan melakukan beberapa tes dan tinjauan kode.

Beberapa pertanyaan bagus untuk dibaca untuk mendapatkan wawasan lebih lanjut tentang cara mempercepat skrip Python di ArcGIS:

Kinerja skrip ArcGISS dan kumpulan data spasial yang besar

Background Geoprocessing (64-bit)

Arcgis CopyFeatures tool sangat lambat ketika mengekspor ke SDE

Cara untuk Mempercepat Skrip Python Berjalan Sebagai Alat ArcGIS

Pertimbangan geoprosesing untuk data ArcSDE


Terima kasih banyak, Anda menyelamatkan hari Jumat saya. Saya ingin menambahkan bahwa ya, saya bisa memanggil database dalam file batch yang dinamai "Database Connections\\THIS.sde". Mungkin ini karena file batch hanya memulai skrip Python yang menggunakan variabel ini? Saya tidak dapat memiliki basis data THIS database.sdeyang aneh bagi saya karena ada ruang dalam Database Connections. Terima kasih lagi,
Patty Jula

Senang itu membantu. 1. Bagaimana penampilannya saat ini? 2. Menarik dengan "Koneksi Database". Saya sangat yakin bahwa Anda tidak dapat merujuk ke "folder" ini di dalam jendela Katalog ketika tidak menjalankan skrip dari ArcGIS Desktop GUI, tetapi saya salah. Saya telah memperbarui jawaban saya untuk mencerminkan ini. 3. Anda dapat memiliki file koneksi "database.sde ini", spasi boleh digunakan. Tetapi Anda tidak dapat memiliki database di Oracle dengan spasi dengan cara kerja DBMS.
Alex Tereshenkov

Kinerja ditingkatkan sekarang. Proses untuk menjalankan kelas fitur rekaman juta (dari poin alamat) berjalan pada mesin Windows 7 / ArcGIS 10.1 sekarang (sebelum hanya membeku pada alat fitur hapus). Diperlukan 3 jam untuk menjalankan seluruh proses ini. Proses ini memakan waktu 50 menit pada mesin XP / 10.0 saya. Apakah tautan ini yang Anda maksud dengan poin 1 dalam jawaban Anda?
Patty Jula

@ PamJula, benar, ini yang ini. Anda tidak perlu menginstal / menggunakan perangkat lunak pemrosesan latar belakang yang diinstal di atas. Anda hanya perlu menggunakan 64bit rasa Python saat menjalankan skrip Anda.
Alex Tereshenkov

Terima kasih untuk sarannya. Saya telah menginstal 64bit Python plus klien Oracle 64bit. Skrip saya masih tidak berjalan pada kecepatan yang mereka jalankan dengan konfigurasi XP / ArcGIS 10.0 saya. Saya akan menjadwalkan tugas untuk menjalankan file batch dan skrip Python malam ini, jika kecepatannya tidak membaik, saya mungkin perlu menyiapkan mesin lain yang menjalankan ArcGIS 10.0.
Patty Jula

1

Saya berharap contoh ini juga akan membantu menjawab pertanyaan dan ada pada perangkat lunak yang lebih baru. Itu didasarkan pada jawaban dan komentar yang disebutkan di atas.

Mendirikan:

  1. Windows 7
  2. SQL Server 2012 R2
  3. ArcGIS 10.2.2 (Server dan Desktop)

Beban harus malam. Itu ~ 9300 catatan dan 234 atribut.

Model asli di bawah dan dilakukan semua dalam SQL Server 2012 R2 / SDE (7 menit melalui ArcCatalog & 3 jam dengan python):

  1. Hapus Baris Kelas Fitur di SDE
  2. Membuat XY event Layer dari tabel di SQL Server
  3. Tambahkan ke Kelas Fitur di SDE

Bagaimana saya mengubahnya (10 detik melalui ArcCatalog & 10 detik melalui python): •

  1. Alat baris hapus yang diganti dengan Truncate tool untuk kelas Fitur GIS di SDE
  2. Ekspor tabel SQL ke FGDB di Drive C lokal
  3. Buat XY Event Layer pada memori lokal
  4. Kelas Fitur ke Kelas Fitur dalam FGDB pada drive C Lokal
  5. LALU Tambah kelas Fitur FGDB ke dalam SDE
  6. Perhatikan bahwa database SQL Server saya ada di drive C yang sama dengan FGDB saya. Ini mungkin melambat sedikit melalui jaringan tetapi kemungkinan besar bukan 3 jam yang saya lihat.

Apa yang sedikit membantu pada model asli adalah mengganti sumber data sesuai # 3 yang direkomendasikan di atas. Ini mencukur 30 detik saat berjalan di ArcCatalog. Dengan python mencukur sekitar 20 menit. Karena itu variabel dalam kecepatan tetapi bukan variabel yang paling berharga untuk ditangani dalam kasus saya. Tampaknya menurut sebagian besar blog SQL Server tidak suka memuat data berat "dari memori" (yaitu membuat xy event layer). SQL / SDE tampaknya lebih memilih objek aktual untuk dimuat. Ini menjelaskan mengapa beban saya yang lain saya lakukan dengan cara yang sama membutuhkan waktu 1 menit, tetapi itu hanya 1000 catatan dengan 15 atribut sehingga saya tidak pernah mempertanyakan efisiensi model saya sampai beban ini perlu dilakukan setiap malam. Seperti disebutkan beban ini adalah 9000 catatan dengan 236 atribut.


0

Masalah dengan kinerja antara 10.0 dan 10.1 adalah sesuatu di perpustakaan SDE diubah di desktop. Kami biasa memposting 1.000.000 malam dan hanya membutuhkan waktu 45 menit, setelah pembaruan perangkat lunak butuh waktu hampir 24 jam. Jelas tidak ada masalah dengan data dan hanya perangkat lunaknya saja yang berubah.

Periksa versi geodatabase untuk memastikannya cocok dengan versi klien yang menjalankan arcpy. Kami melaporkan ini ke ESRI tanpa respons atau pengakuan bug. Cukup jelas dan masalahnya dimulai setelah 10.0 SP1.

Juga tes lain salin / tempel lebih cepat daripada append mencoba ini dari 10.0 dan 10.1 dan kinerja harus serupa. Ini membuktikan ada semacam bug yang terjadi pada versi sebelumnya saat menambahkan geometri.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.