ArcGIS Python SearchCursor dosya kilitleme?


11

Ben kullanıcıya dönmek için bir şekil dosyasının alanından bir değer alır bir komut dosyası var.

Görünüşe göre sadece arcpy.SearchCursor ArcMap 10.0 olarak adlandırıldığında dosyayı kilitler ve kodun çalışması bittikten sonra kaldırılmaz. Kilidi kapatmak için ArcMap'i kapatmam gerekiyor. Kodda, SearchCursor nesnesini satır nesnesinin yanı sıra kullandıktan sonra silerim.

Ben komut dosyası çalışma yolu, sonraki çalışmalarda çalışma alanı klasörünü silmeye çalışır ama kilit nedeniyle olamaz ... tabii ki ArcMap kapatın kadar.

Bu kilidin kaldırılması için herhangi bir tavsiye var mı?

Yanıtlar:


4

sorun giderildikten sonra çözüldü:

rows = arcpy.UpdateCursor(fc)   
delete = rows.deleteRow  
for row in rows:  
    delete(row)  
del row  
del rows

için

rows = arcpy.UpdateCursor(fc)
for row in rows:
    rows.deleteRow(row)
del row
del rows

3

Bkz . Python betiğinde oluşturulan dosya coğrafi veritabanındaki ve özellik sınıfındaki kilitlenmeden kurtulamıyor . Aynı konuya benziyor. Özellik sınıfını açıkça silerek daha önce etrafta dolaştım. Bunun her durumda işe yarayıp yaramayacağından emin değilim.

import arcpy

fcPath = 'c:/temp/features.shp'
idFld = 'OBJECTID'
cur = arcpy.SearchCursor(fcPath)
for row in cur:
    id = row.getValue(idFld)
    row = None
cur = None
r = arcpy.Delete_management(fcPath)

print r.getOutput(0)

Bir çöp toplama zorlamak da işe yarayabilir, ancak benim önsezim bunun arcpy veya ArcMap'in iç işleyişi ile ilgisi var.

import gc
gc.collect()

Satır referansı, imlecin her yinelemesinden sonra kaldırılması gerektiği için bunu düzenledim, aksi takdirde döngü dışındaki çağrı gereksizdir. Bu aynı zamanda oy verdim onun vardı aynı yolu etrafında alabilir tek yolu.
Kıllı

@Kıllı Tamam, ama bence bu bir sessiz nokta. Satır değişkenine yeni bir satır nesnesi atandığında, Python her bir yinelemede önceki satır nesnesine yapılan başvuruları azaltır . döngü son satır atamasını temizledikten sonra. Döngü içinde hareket ettirmek, çabanın tekrarlanmasıdır. Her durumda, arcpy veya ArcMap dahili olarak satır nesnelerine başvuruda bulunmadıkça, çöp toplayıcı belleği yeniden konumlandırmalıdır. row = None
tharen

hemfikir olmayı kabul etmenin bir sakıncası yoksa tartışma konusu olması. Arcpy'deki çöp toplama işleminin hatalı olduğunu ve kapatırsanız aslında çok daha hızlı olduğunu biliyorum. Satırın satırda hiçbir şeye ayarlanmamasına gelince, bu şekilde daha iyi çalıştığını biliyorum. Bazıları hiçbir şey için bir şey ayarlamak gereksiz, ama değil. Senaryonuzun başında çöp koleksiyonunuzu kapatın ve zaman farklarını ölçün. Ben de del satır kullanın, satır = yok, ama bu başka bir tartışma: deneyin ithalat gc gc.disable ()
Tüylü

@Kıllı, gc'yi devre dışı bırakmak benim için olmadı. Bir deneyeceğim.
tharen

Bu benim için işe yaramıyor çünkü özellik sınıfına ihtiyacım var. Ayrıca daha sonra başka bir özellik sınıfı üzerinde bir UpdateCursor olsun ve bu da kilitli olsun. Olmam gereken yere ulaşmak için aynalar ve el çabukluğu kullandım. Ne kadar dayanacağından emin değilim. Teşekkürler.
Justin

1

ArcPy betiğinizi ArcMap içinden çalıştırmanız mı gerekiyor? Oluşturduğunuz bir arabirimin veya araç kutusunun bir parçası olmadığı sürece, bir Python konsolundan, IDLE veya Eclipse vb.'den ArcMap dışında çalıştırabilirsiniz (üzerinde çalıştığı makinede uygun bir lisansınız olduğu sürece). Bu durumda, ArcPy komut dosyanızı bir alt işlem olarak oluşturmak için küçük bir Python kodu yazabilirsiniz ve alt işlem kapatıldığında kilit serbest bırakılmalıdır.

ArcGIS kilitleri bir acıdır. Anıtsal bir ağrı olan makineyi kapattıktan sonra bile bir kilidin devam ettiği durumlar yaşadım (genellikle Arc kilitleri toplayamadan önce çöktüyse). Son çare olarak, bu olursa, .LOCK dosyasını bulmak ve el ile silmek için Windows Gezgini'ni kullanın. ArcMap veya bir Python işlemi tarafından erişiliyorsa bu işe yaramaz, bu yüzden nispeten güvenlidir ... ama bu gerçekten bir Hapishane kartıdır ve iyi bir uygulama değildir :)


1

Hem satır hem de imleç nesnelerini (örn. del row, rows) Düzgün bir şekilde sildiğinizde ve kilit kalıyorsa, büyük olasılıkla arcpy yerine ArcMap'in hala ona başvurması nedeniyle.

Şekil dosyası içindekiler tablosundaki bir katman tarafından başvuruda bulunuluyor mu yoksa komut dosyası aracınız tarafından İçindekilere ekleniyor mu?

İkincisi ise, ArcMap'ta Coğrafi İşleme-> Coğrafi İşleme Seçenekleri altında "Coğrafi işleme işlemlerinin sonuçlarını ekrana ekle" seçeneğini devre dışı bırakmayı deneyebilirsiniz .

Ek bir öneri: Bunu geçici / ara veri kümesi olarak yapıyorsanız ve özellik sayısı çok fazla değilse in_memory, kilitleme sorununu tamamen ele almak ve hoş bir potansiyel performans artışı elde etmek için şekil dosyası yerine çalışma alanını kullanmayı deneyin. .

Komut dosyasından çıkmadan önce Delete (Veri Yönetimi) kullanarak in_memory çalışma alanını veya orada oluşturduğunuz belirli veri kümelerini sildiğinizden emin olun , aksi takdirde uygulama kapanana kadar bellekte kalmaya devam eder.

Son olarak, şekil dosyası kilitleme davranışının, içindekiler tablosundan bir katman kaldırdığınızda kilit dosyalarını kaldırmayarak 10.0'da değiştiğini de not ediyorum. Ayrıca bu makaleye ve bu ilgili soruya bakın .


Kesinlikle ArcMap. Sanırım bir imleç çağırmak önceki imleçlerin kilidini öldürüyor. Bir fc üzerinde bir SearchCursor çağırıyorum, sonra başka bir fc üzerinde bir UpdateCursor ve önceki kilit kaybolur. Sadece kilit öldürme kara kutu stilini işlemek için silinmesi gerekmeyen bir dosya üzerinde üç sahte bir imleç çağırabilirim. Teşekkürler.
Justin
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.