Meskipun pertanyaan ini sudah dijawab, saya pikir saya bisa berpadu memberi dua sen.
PENOLAKAN : Saya bekerja untuk ESRI di tim GeoDatabase selama beberapa tahun dan bertanggung jawab untuk memelihara berbagai bagian kode GeoDatabase (Versi, Kursor, EditSessions, Sejarah, Kelas Hubungan, dll.).
Saya pikir sumber terbesar masalah kinerja dengan kode ESRI tidak memahami implikasi menggunakan objek yang berbeda, khususnya, detail "kecil" dari berbagai abstraksi GeoDatabase! Sangat sering, percakapan beralih ke bahasa yang digunakan sebagai biang keladi masalah kinerja. Dalam beberapa kasus bisa jadi. Tapi tidak setiap saat. Mari kita mulai dengan diskusi bahasa dan kembali lagi.
1.- Bahasa pemrograman yang Anda pilih hanya penting ketika Anda melakukan sesuatu yang rumit, dalam lingkaran yang ketat. Sebagian besar waktu, ini tidak terjadi.
Gajah besar di ruangan itu adalah inti dari semua kode ESRI, Anda memiliki ArcObjects - dan ArcObjects ditulis dalam C ++ menggunakan COM . Ada biaya untuk berkomunikasi dengan kode ini. Ini berlaku untuk C #, VB.NET, python, atau apa pun yang Anda gunakan.
Anda membayar harga saat inisialisasi kode itu. Itu mungkin biaya yang dapat diabaikan jika Anda melakukannya hanya sekali.
Anda kemudian membayar harga untuk setiap kali Anda berinteraksi dengan ArcObjects berikutnya.
Secara pribadi, saya cenderung menulis kode untuk klien saya di C #, karena mudah dan cukup cepat. Namun, setiap kali saya ingin memindahkan data atau melakukan pemrosesan untuk sejumlah besar data yang sudah diimplementasikan dalam Geoprocessing, saya hanya menginisialisasi subsistem scripting dan mengirimkan parameter saya. Mengapa?
- Itu sudah diterapkan. Jadi mengapa menciptakan kembali kemudi?
- Ini mungkin sebenarnya lebih cepat . "Lebih cepat daripada menulisnya dalam bahasa C #?" Iya nih! Jika saya menerapkan, katakanlah, memuat data secara manual, itu berarti saya membayar harga .NET switching konteks dalam loop yang ketat. Setiap GetValue, Insert, ShapeCopy memiliki biaya. Jika saya melakukan satu panggilan dalam GP, seluruh proses pemuatan data akan terjadi dalam implementasi aktual GP - dalam C ++ dalam lingkungan COM. Saya tidak membayar harga untuk pengalihan konteks karena tidak ada - dan karenanya lebih cepat.
Ah ya, jadi solusinya jika menggunakan banyak fungsi geoprocessing. Sebenarnya kamu harus hati-hati.
2. GP adalah kotak hitam yang menyalin data (mungkin tidak perlu) di sekitar
Itu adalah pedang bermata dua. Ini adalah kotak hitam yang melakukan beberapa sihir secara internal dan mengeluarkan hasil - tetapi hasil tersebut sangat sering diduplikasi. 100.000 baris dapat dengan mudah dikonversi menjadi 1.000.000 baris pada disk setelah Anda menjalankan data Anda melalui 9 fungsi yang berbeda. Hanya menggunakan fungsi GP seperti membuat model GP linier, dan ...
3. Merantai terlalu banyak fungsi GP untuk dataset besar sangat tidak efisien. Model GP (berpotensi) setara dengan mengeksekusi kueri dengan cara yang benar-benar sangat bodoh
Sekarang jangan salah paham. Saya suka Model GP - ini menyelamatkan saya dari menulis kode sepanjang waktu. Tetapi saya juga sadar bahwa ini bukan cara paling efisien untuk memproses kumpulan data besar.
Sudahkah Anda mendengar Perencana Kueri ? Tugasnya adalah untuk melihat pernyataan SQL yang ingin Anda jalankan, menghasilkan rencana eksekusi dalam bentuk grafik terarah yang terlihat banyak seperti Model GP , melihat statistik yang disimpan dalam db, dan memilih yang paling urutan optimal untuk menjalankannya . GP hanya mengeksekusi mereka dalam urutan Anda meletakkan sesuatu karena tidak memiliki statistik untuk melakukan sesuatu yang lebih cerdas - Anda adalah perencana kueri . Dan coba tebak? Urutan di mana Anda menjalankan sesuatu sangat tergantung pada dataset Anda. Urutan di mana Anda menjalankan sesuatu dapat membuat perbedaan antara hari dan detik dan itu terserah Anda untuk memutuskan.
"Hebat" katamu, aku tidak akan menulis naskah sendiri dan berhati-hati tentang bagaimana aku menulis barang. Tapi apakah Anda mengerti abstraksi GeoDatabase?
4.Tidak memahami abstraksi GeoDatabase dapat dengan mudah menggigit Anda
Alih-alih menunjukkan setiap hal yang mungkin dapat memberi Anda masalah, izinkan saya hanya menunjukkan beberapa kesalahan umum yang saya lihat sepanjang waktu dan beberapa rekomendasi.
- Memahami perbedaan antara Benar / Salah untuk kursor Daur Ulang . Bendera kecil mungil ini disetel ke true dapat membuat runtime order magnitude lebih cepat.
- Letakkan meja Anda di LoadOnlyMode untuk memuat data. Mengapa memperbarui indeks pada setiap sisipan?
- Memahami bahwa meskipun IWorkspaceEdit :: StartEditing terlihat sama di semua ruang kerja, mereka adalah binatang yang sangat berbeda pada setiap sumber data. Pada Enterprise GDB, Anda mungkin memiliki versi atau dukungan untuk transaksi. Pada shapefile, itu harus diimplementasikan dengan cara yang sangat berbeda. Bagaimana Anda menerapkan Undo / Redo? Apakah Anda bahkan perlu mengaktifkannya (ya, itu dapat membuat perbedaan dalam penggunaan memori).
- Perbedaan antara operasi batch, atau operasi baris tunggal. Contoh kasus GetRow vs GetRows - ini adalah perbedaan antara melakukan kueri untuk mendapatkan satu baris atau melakukan satu kueri untuk mengambil beberapa baris. Putaran ketat dengan panggilan ke GetRow berarti kinerja yang mengerikan dan merupakan penyebab masalah kinerja # 1
- Gunakan UpdateSearchedRows
- Memahami perbedaan antara CreateRow dan CreateRowBuffer . Perbedaan besar dalam runtime insert.
- Memahami bahwa IRow :: Store dan IFeature :: Store memicu operasi polimorfik super berat . Ini mungkin alasan penyebab # 2 kinerja sangat lambat. Itu tidak hanya menyimpan baris, ini adalah metode yang memastikan jaringan geometrik Anda OK, bahwa ArcMap Editor mendapat pemberitahuan bahwa baris telah berubah, yang memberi tahu semua kelas hubungan yang ada hubungannya dengan baris ini valid untuk membuat Pastikan kardinalitasnya valid, dll. Anda seharusnya tidak memasukkan baris baru dengan ini, Anda harus menggunakan InsertCursor !
- Apakah Anda ingin (perlu) melakukan sisipan tersebut di bagian EditSession? Itu membuat perbedaan besar jika Anda melakukannya atau tidak. Beberapa operasi memerlukannya (dan membuat segalanya lebih lambat), tetapi ketika Anda tidak membutuhkannya, lewati fitur undo / redo.
- Kursor adalah sumber daya yang mahal. Setelah Anda memiliki pegangan ke satu, Anda dijamin bahwa Anda akan memiliki Konsistensi dan Isolasi dan yang memiliki biaya.
- Tembolok sumber daya lain seperti koneksi basis data (jangan membuat dan menghancurkan referensi Workspace Anda) dan menangani Tabel (setiap kali Anda membuka atau menutup satu - beberapa tabel metadata perlu dibaca).
- Menempatkan FeatureClasses di dalam atau di luar FeatureDataset membuat perbedaan besar dalam kinerja. Itu tidak dimaksudkan sebagai fitur organisasi!
5.Dan yang terakhir dan yang tidak kalah ...
Memahami perbedaan antara operasi terikat I / O dan terikat CPU
Jujur saya berpikir tentang memperluas lebih pada setiap satu dari item-item itu dan mungkin melakukan serangkaian entri blog yang mencakup setiap satu dari topik-topik itu, tetapi daftar simpanan kalender saya hanya menampar wajah saya dan mulai berteriak pada saya.
Dua sen saya.