ArcGISScripting ve büyük uzaysal veri kümelerinin performansı


38

Şu anda, az miktarda tablo üzerinde toplam 8 normalize edilmiş oldukça büyük bir veri setini (toplamda ~ 10.000 kayıt) işlemek için arcgcripcripting modülünü kullanarak bir python betiği yazıyorum. Süreç koordinat tuples (x, y) dayalı bir özellik oluşturma ve rehberlik için diğer 7 tablolardaki ilişkileri kullanarak bir grafik (düğümler ve çizgiler) oluşturma oluşur. Son çıktı, düğümleri ve kenarları uzamsal veri kümeleriyle görsel olarak ilişkileri temsil eden kişisel bir coğrafi veritabanıdır (pgdb / fgdb).

İlk denemem, ortaya çıkan çoktan çoğa ilişkilerin bağlantı tablolarını (InsertCursor) doldurmak için yeni coğrafi veritabanı tablolarının ve SearchCursor kayıt kümelerinin sorgularını kullanmaktı. Bu, 15-20 dak işleme süresi hariç, çok iyi çalıştı.

Python'daki cProfiler modülünü kullanarak, bağlantı tablolarını imleç talepleriyle (Arama ve Ekleme imleçleri) korkunç performansa neden olan bağlantı sorgularını doldurmak için kişisel bir coğrafi veri tabanının 'harcanması' açıktı.

Biraz refactoring ile işlem süresinin 2.5 dakikanın altında olmasını başardım. İşlem, coğrafi veri tabanı şemasının kodda kısmi olarak oluşturulması ve imleçlerin imlecinin ArcCorsors'a yazılmasıyla ilgili tüm isteklerin sınırlandırılması taleplerinin sınırlandırılmasıydı.

Benim sorum performanstan biri;

  • İnsanlar büyük veri setleriyle çalışırken makul hesaplama sürelerini korumak için hangi teknikleri kullandılar?
  • Optimizasyon araştırmamda kaçırdığım ESRI tarafından önerilen yöntemler var mı?

    Gizli bir imleç oluştururken ortaya çıkan ek yükü, özellikle kişisel bir coğrafi veri tabanından geliyorsa, ancak bu siteden ve Google'dan gelen performansla ilgili uzunca bir cevap arayışından sonra, performansın insanların uğraşının ön saflarında olmadığı izlenimindeyim. .

  • Bir ESRI ürün kullanıcısı olarak, bu performansta bir gecikme yaşanır mı?

GÜNCELLEME

Bu ürünle yapılan bazı çalışmalardan sonra, uzamsal bilgileri özel bir formattan bir coğrafi veritabanına dönüştürme işlemini alan bir optimizasyon teknikleri listesi biriktirdim. Bu kişisel ve dosya coğrafi veritabanı için geliştirilmiştir. çerez:

  1. Veriyi oku ve hafızada rasyonelleştir. Bu zamanınızı yarı yarıya azaltacaktır.

  2. Bellekte özellik sınıfları ve tablolar oluşturun. Hafızanızı ram disk olarak kullanmak, işlevlerinizi orada gerçekleştirmek ve diske yazmak için 'veri set keywork' in_memory 'özelliğini kullanın.

  3. Diske yazmak için, özellik sınıfları için CopyFeatureclass ve tablolar için CopyRow kullanın.

Bu 3 şey, 100.000+ özelliği bir coğrafi veritabanına 30 - 30 - 40 saniye arasında dönüştüren bir komut dosyası aldı, buna ilişki sınıfları da dahildir. Hafifçe kullanılmazlar, yukarıdaki yöntemlerin çoğu çok fazla bellek kullanır, bu da dikkat etmiyorsanız sorunlara neden olabilir.


1
Farklı bir depolama formatı kullanmayı denediniz mi? Bir dosya coğrafi veritabanı nasıl çalışır?
Derek Swingley

Bir dosya coğrafi veritabanı, kişisel bir coğrafi veritabanından biraz daha kötü bir performans gösterir. Dün, kurumsal formatta performansı test etmek için bir ArcSDE örneği ayarlayıp ayarlayarak geçirdim. Bulgularımdan sizi haberdar edeceğim
OptimizePrime

2
Bu şimdi size yardımcı olmuyor, ancak Python'daki 10.1 imleç performansında yeni veri erişim modülü ile büyük bir faktör (ortalama durumlarda büyüklük sırasına göre bir şey) geliştirildi.
Jason Scheirer

In_memory kullanımları bir InMemoryWorkspace edndoc.esri.com/arcobjects/9.2/ComponentHelp/esriDataSourcesGDB/... , satır keyfi bir sayı, sonra ScratchWorkspaceFactory (yani FileGDB) için her şeyi döker ve tüm işi yapmak için FileGDB güvenir
Ragi Yaser Burhum

Yanıtlar:


56

Bu sorunun cevabı çoktan cevaplanmış olmasına rağmen, iki sentimi verdiğimde çalabileceğimi düşündüm.

YASAL UYARI : Birkaç yıl boyunca GeoDatabase ekibinde ESRI için çalıştım ve GeoDatabase kodunun çeşitli bölümlerini (Sorumluluk, İmleçler, Düzenleme, Tarih, İlişki Sınıfları, vb.) Korumaktan sorumluydum.

ESRI kodundaki en büyük performans sorunlarının kaynağının, farklı nesnelerin, özellikle de çeşitli GeoDatabase soyutlamalarının "küçük" ayrıntılarının kullanılmasının etkilerini anlamadığını düşünüyorum! Çok sık olarak, konuşma, performans sorunlarının suçlusu olarak kullanılan dile geçer. Bazı durumlarda olabilir. Fakat her zaman değil. Dil tartışması ile başlayalım ve geri dönüş yolumuza gidelim.

1.- Seçtiğiniz programlama dili sadece karmaşık bir işlemi yaparken sıkı bir döngüde önemlidir. Çoğu zaman, durum bu değil.

Odadaki büyük fil, tüm ESRI kodlarının merkezinde, ArcObjects'e sahip olmanız - ve ArcObjects, COM kullanarak C ++ dilinde yazılmıştır . Bu kodla iletişim kurmanın bir bedeli vardır. Bu, C #, VB.NET, python veya kullandığınız diğer şeyler için geçerlidir.

Bu kodun başlangıcında bir bedel ödersiniz. Sadece bir kez yaparsanız bu ihmal edilebilir bir maliyet olabilir.

Ardından, ArcObjects ile etkileşime girdiğiniz her bir sonraki zaman için bir ücret ödersiniz.

Şahsen, müşterilerim için C # kodunu yazma eğilimindeyim, çünkü yeterince kolay ve hızlı. Ancak, ne zaman Geoprocessing uygulamasında halihazırda uygulanmış büyük miktarda veri için veri taşımak veya bazı işlemler yapmak istediğimde sadece komut dosyası alt sistemini başlatıyorum ve parametrelerimi iletiyorum. Neden?

  • Çoktan uygulandı. Peki neden tekerleği yeniden icat ettin?
  • Aslında daha hızlı olabilir . "C # ile yazmaktan daha hızlı?" Evet! Veri yüklemeyi manuel olarak uygularsam, bunun anlamı, .NET bağlamında anahtarlama yapmak için sıkı bir döngü ücreti ödüyorum. Her GetValue, Insert, ShapeCopy'nin bir maliyeti vardır. Bir aramayı GP’de yaparsam, veri yükleme işleminin tamamı GP ortamında C ++’da COM ortamında gerçekleşir. Bağlam geçişi için fiyat ödemiyorum çünkü hiçbiri yok - ve dolayısıyla daha hızlı.

Ah evet, öyleyse çözüm çok sayıda coğrafi işlem işlevinin kullanılması durumunda. Aslında dikkatli olmalısın.

2. GP, verileri (potansiyel olarak gereksiz yere) etrafa kopyalayan bir kara kutudur.

İki ucu keskin bir kılıçtır. İçinde bir miktar sihir yapan ve sonuçları tüküren bir kara kutu. Fakat bu sonuçlar sıklıkla çoğaltılıyor. Verilerinizi 9 farklı işlevde çalıştırdıktan sonra, 100.000 satır kolayca disk üzerinde 1.000.000 satıra dönüştürülebilir. Yalnızca GP işlevlerini kullanmak, doğrusal bir GP modeli oluşturmak gibidir ve peki ...

3. Büyük veri kümeleri için çok fazla GP işlevi zincirleme son derece yetersizdir. Bir GP Modeli (potansiyel olarak) gerçekten çok aptalca bir şekilde bir sorgu yürütmeye eşdeğerdir

Şimdi beni yanlış anlama. GP Modellerini çok seviyorum - her zaman kod yazmaktan kurtarıyor. Ancak bunun büyük veri setlerini işlemenin en etkili yolu olmadığını da biliyorum.

Bir Sorgu Planlayıcısı duydunuz mu? Yapılması gereken SQL ifadesine bakmak, GP Modeline çok benzeyen, yönlendirilmiş bir grafik biçiminde bir yürütme planı oluşturmak, db'de depolanan istatistiklere bakmak ve en çok seçmek bunları yürütmek için en uygun sipariş . GP sadece bunları bir şeyler koyma sırasına göre yürütür, çünkü daha akıllıca bir şey yapacak istatistiklere sahip değildir - siz sorgu planlamacısınız . Ve tahmin et ne oldu? Bir şeyleri yürütme sırası veri kümenize çok bağlıdır. Bir şeyleri uyguladığınız sıra, günler ve saniyeler arasında fark yaratabilir ve bu size karar vermek size kalmış.

"Harika" diyorsun, kendim bir şeyler yazmayacağım ve bir şeyler nasıl yazdığım konusunda dikkatli olacağım. Ama GeoDatabase soyutlamalarını anlıyor musunuz?

4. GeoDatabase soyutlamaları anlamıyorum kolayca sizi ısırır

Size sorun çıkarabilecek her şeyi işaret etmek yerine, her zaman gördüğüm birkaç ortak hatayı ve bazı önerileri göstereyim.

  • Geri Dönüşüm imleçleri için Doğru / Yanlış arasındaki farkı anlama . True olarak ayarlanan küçük minik bayrak, çalışma zamanı siparişlerini daha hızlı hale getirebilir.
  • Veri yüklemeleri için tablonuzu LoadOnlyMode'a yerleştirin . Neden her yazıdaki dizini güncelle?
  • IWorkspaceEdit :: StartEditing'in tüm çalışma alanlarında aynı görünse de, her veri kaynağında çok farklı canavarlar olduğunu anlayın. Enterprise GDB'de işlemlerde sürüm veya destek alabilirsiniz. Şekil dosyalarında, çok farklı bir şekilde uygulanması gerekecektir. Geri Al / Yinele'yi nasıl uygularsınız? Bunu etkinleştirmeniz bile gerekiyor mu (evet, bellek kullanımında bir fark yaratabilir).
  • Toplu işlemler veya tek satır işlemleri arasındaki fark. Örnek olayda GetRow - GetRows - bu bir satır almak için bir sorgu yapmak veya birden fazla satır almak için bir sorgu yapmak arasındaki farktır. GetRow çağrısı ile yapılan sıkı bir döngü, korkunç performans anlamına gelir ve performans sorunlarının 1. sorumlusu
  • UpdateSearchedRows kullanın
  • CreateRow ve CreateRowBuffer arasındaki farkı anlayın . İnsert çalışma zamanındaki büyük fark.
  • IRow :: Store ve IFeature :: Store'un süper ağır polimorfik işlemleri tetiklediğini anlayın . Bu muhtemelen gerçekten yavaş performansın 2. numaralı suçluluğudur. Yalnızca satırı kaydetmiyor, geometrik ağınızın iyi durumda olduğundan emin olmak için kullanılan yöntemdir, ArcMap Editor'ün bir satırın değiştiğini, bu satırla ilgisi olan tüm ilişki sınıflarını bildiren bir satırın değiştiğini bildirir. kardinalliğin geçerli olduğundan emin olun, vb. Bununla yeni satırlar eklememelisiniz, bir InsertCursor kullanmalısınız !
  • Bir EditSession'da bu ekleri yapmak ister misiniz (gerekir)? İsterseniz ister olmasanız çok büyük bir fark yaratır Bazı işlemler gerektirir (ve işleri daha da yavaşlatır), ancak ihtiyacınız olmadığında geri alma / yineleme özelliklerini atlayın.
  • İmleçler pahalı kaynaklardır. Bire bir kulpunuz olduğunda, Tutarlılık ve İzolasyon yapacağınız ve bunun bir maliyeti olduğu garantilidir .
  • Veritabanı bağlantıları gibi diğer kaynakları önbelleğe alın (Çalışma alanı referansınızı oluşturup yok etmeyin) ve Tablo tanıtıcıları (her birini açtığınızda veya kapattığınızda - birkaç meta veri tablosunun okunması gerekir).
  • FeatureClass'ları bir FeatureDataset'in içine veya dışına koymak, performansta büyük fark yaratır. O edilir değil bir organizasyon özelliği olarak geliyordu!

5.Ve son ve en az değil ...

G / Ç sınırı ve CPU'ya bağlı işlemler arasındaki farkı anlayın

Dürüst olmak gerekirse, bu öğelerin her birinde daha fazla genişletmeyi ve belki de bu konuların her birini kapsayan bir dizi blog girişi yapmayı düşündüm, ancak takvimimin biriktirme listesi beni yüzüme tokatladı ve bana bağırmaya başladı.

Benim iki Sentim.


5
Teşekkürler. Bu yazı haha ​​yerine iş yapmalıydım haha
Ragi Yaser Burhum

3
+1 Girişiniz için çok teşekkür ederim Bay Burhum. Bu almayı hedeflediğim cevap türü. İki kez oy verebilseydim yapabilirdim !! ArcGISScripting (python) kullanıcılarının bu cevaptan alması gereken şey, her ne kadar bağlantılar ArcObjects ve .Net kavramlarını yansıtıyor olsa da, temel COM nesneleri aynıdır, bu nesnelerin anlaşılması kodları daha iyi bir dilde yazmanıza yardımcı olacaktır. Burada birçok harika bilgi var!
OptimizePrime

1
@OptimizePrime Bu harika bir özettir. Ve haklısınız - ESRI ürünlerinin dışarı performans sıkmak istiyorsanız ArcObject etkileri göz ardı edemeyiz
Ragi Yaser Burhum

1
teşekkürler, store () 'u imleçlerle değiştirdim ve uygulamalarımda çok zaman kazandım!
42'de superrache

5

Genel olarak, performans hesaplamaları için, ESRI ile ilgili herhangi bir şeyi kullanmaktan uzak durmaya çalışıyorum. Örneğin, işlemi adımlarla, ilk önce verileri normal python nesnelerine okuyan, hesaplamaları yapan ve ardından son ESRI uzaysal formata dönüştüren son adımı öneririm. ~ 10k kayıtlar için, işlem için her şeyi bellekte saklamaktan kurtulabilirsiniz, bu da kesin bir performans kazancı sağlayacaktır.


Cevabınız için teşekkürler. Bu iyi bir öneri. Arccisscripting kullanmadan önce gerekli işlemleri yapmak için kodu yeniden denemeye başladım. ArcInfo günlerinden beri yazılımla çalıştıktan sonra, CPU performansı ve Donanım kapasitesinin artması beni sinir bozuyor, ArcGIS Harita / Bilgi / Düzenleyici XX performansının durgun olduğunu düşünüyorum. Belki GPU'ların tanıtılması işleri artırabilir. ESRI kod tabanının iyi bir refaktörü de yardımcı olabilir
OptimizePrime

1

Sahip olduğunuz donanıma bağlı olarak, ESRI Geocoder Örneğinde görüntülenen seçeneği de göz önünde bulundurabilirsiniz; Size büyük bir veri setini kırmak ve size neredeyse çok parçacıklı bir yaklaşım vermek için birden fazla python örneği çalıştırmak için bir çerçeve sunar. Tek bir Python örneğinde coğrafi kodlama performansının saatte 180.000'den, makinemde 8 paralel işlem gerçekleştirme sayesinde bir milyonun üzerinde olduğunu gördüm.

Elimden geldiğince uzaklaşmanın ve veriyi veritabanında tutmanın ve tablolarımda işlevsel çalışmanın ve sadece ESRI alanında açık olan GIS'in kullanılmasının büyük performans artışları sağladığını gördüm.


Bunlar harika fikir. Bu komut dosyasında bazı işlemleri yapma fırsatım var, ancak şişe boyunlarımın COM kitaplıklarını ve Geodatabase I / O'larını başlattığını buldum. G / Ç ile ilgili olarak, tek bir yazma ihtiyacını azalttım. Optimize etmek için daha fazla zaman harcarsam, patronum zinde olacak;) Bu yüzden daha fazlasını isterse, performansın son sıkıntısı olarak iplik çekmeyi bırakıyorum. Şu anda dakikada 60.000 özelliği işliyorum.
OptimizePrime

0

Bu diğer forum yazılarını, optimizasyon bağlamındakiler gibi ilginç bulabilirsiniz ancak tarama verileri ve genel olarak:

ArcGIS Geoprocessing Tools kullanan Python Scriptlerini Derlemek?

Bağımsız Python betiğinde ArcCatalog vs ArcGIS Hydrology araç kutusu araçlarını kullanarak işlem süresi?

gp.scratchworkspace ayarı, havza tarifleri yapmak için yazdığım bazı python kodlarında benim için büyük bir fark yarattı.

GÜNCELLEME'nizde 1 ve 2 numaralarını gösteren bazı kod örneklerini orijinal sorunuza gönderebilir misiniz? Bunun mekaniğini görmek isterdim (yalnızca burada özellik sınıfı verileriyle uğraştığınızı farz ediyorum)

teşekkürler Tom

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.