Özellik sınıfındaki kilidi kaldır


11

Bir özellik sınıfını silmeye çalıştığımda, sonra veya aynı özellik sınıfını kullanan bir Arcgis motor uygulamasının kullanımı sırasında kilitle ilgili bir hata aldım, bu yüzden bilgisayarı yeniden başlatana kadar bu kilide binemiyorum.

ben arcpy veya arcobjects 10.1 kullanarak kilitleri kaldırmak için bir yol bilmek istiyorum, ben de geodatabase kilitler arcengine uygulaması içinde kilit binmek alabilir, mükemmel olurdu kilitleri hakkında SE farklı mesajlar gördüm ama hiç kimse bunlardan biri ArcObjects kullanarak ücretsiz kilitlere çözüm sağlar.


1
Bir süre önce benzer bir sorum vardı ( gis.stackexchange.com/q/28977/8104 ). Bellek nesnelerinde silme hakkında iyi bilgiler olmasına rağmen kilitler hakkında bir cevap bulamadım.
Aaron

Yanıtlar:


12

Arcpy komut dosyası kullanıyorsanız, veri kilidi sorunları 10.1 ile daha da sorunlu hale geldi .

Kilitler kodunuz tarafından oluşturuluyorsa, kendiniz temizlemezsiniz. Özellik sınıflarına, çalışma alanlarına, imleçlere vb. İlişkin tüm başvuruları serbest bırakın. Kilitlenen nesnelere artık başvurunuz olmadığında kilitler kaldırılır.

Peki, bu şekilde çalışması gerekir, ancak nadiren çalışır. Genellikle bir kod zaman zaman çalışır, ancak genellikle farklı yerlerde açıklanamaz şekilde kilitlenir.

Sorun, kilitlerin orada bir süre `` bir süreliğine '' kalması gibi görünüyor, ancak kod, kilitlerin kaldırılma hızından çok daha hızlı çalışıyor. Bununla birlikte, dahili Arc araçlarından bazıları kilitleri isteğe bağlı olarak temizlenmeye zorlamaktadır (kilitler tüm GDB'lere aynı anda uygulandığından, bir kilit, içerilen Özellik Sınıflarından herhangi biriyle çalışmanızı engelleyecektir). Bu araçlar arcpy.Compact_management () ve arcpy.Exists () şeklindedir.

Kodum içinde güvenilirliği önemli ölçüde arttıran küçük bir işlev var (içinde birden fazla GDB ve Özellik Sınıfı oluşturan ve düzenleyen bir komut dosyası için):

def clearWSLocks(inputWS):
  '''Attempts to clear locks on a workspace, returns stupid message.'''
  if all([arcpy.Exists(inputWS), arcpy.Compact_management(inputWS), arcpy.Exists(inputWS)]):
    return 'Workspace (%s) clear to continue...' % inputWS
  else:
    return '!!!!!!!! ERROR WITH WORKSPACE %s !!!!!!!!' % inputWS

Sadece çalışma alanı (GDB) yolunu işleve geçirerek kullanılır ve çalışma alanındaki her işlemden sonra (yani GDB oluşturma) veya çalışma alanındaki Özellik Sınıflarında (yani İmleçler, alan ekleme, hesaplamalar vb.) Yapılmalıdır. . Örneğin (burada üstte işlev bulunan bağımsız bir komut dosyası olarak gösterilir; işlevi kullanmak için kopyalayın ve burada gösterildiği gibi içe aktarmalar ve gerçek program arasına yapıştırın):

import arcpy

def clearWSLocks(inputWS):
  '''Attempts to clear locks on a workspace, returns stupid message.'''
  if all([arcpy.Exists(inputWS), arcpy.Compact_management(inputWS), arcpy.Exists(inputWS)]):
    return 'Workspace (%s) clear to continue...' % inputWS
  else:
    return '!!!!!!!! ERROR WITH WORKSPACE %s !!!!!!!!' % inputWS

GDBpath = 'C:/Temp/'
GDBname = 'Test.gdb'
tableName = 'SweetFC'
arcpy.CreateFileGDB_management(GDBpath, GDBname)
print(clearWSLocks(GDBpath+GDBname))
arcpy.CreateTable_management(GDBpath+GDBname, tableName)
print(clearWSLocks(GDBpath+GDBname))
# etc....

3
Kilit varsa kompakt çalışmaz. Bir FGDB'nin birçok işlemini çalıştırdığınızda, ancak kendi çalışma zamanının maliyetiyle, performansı artıracaktır.
Michalis Avraam

sadece neden iki kez var olduğunu merak, clearWSLocks tüm () eğer üçüncü ifade demek?
makak

Aynı fikirde olabilirim, bunu kilitleri temizlemek için bulamadım. :( ve şimdiye kadar birçok farklı şey denedik.
Vidar


7

Kilitler kodunuz tarafından oluşturuluyorsa, kendiniz temizlemezsiniz. Özellik sınıflarına, çalışma alanlarına, imleçlere vb. İlişkin tüm başvuruları serbest bırakın. Kilitlenen nesnelere artık başvurunuz olmadığında kilitler kaldırılır.


1
Bu iş parçacığı oldukça eski olduğunu biliyorum, ama arcpy içinde bir FGDB silmek mümkün olan bir sorun yaşıyorum. "Özellik sınıflarına, çalışma alanlarına, imleçlere vb. İlişkin tüm başvuruları serbest bırak" ile tam olarak ne demek istersiniz? Söz konusu referansları salıvermeye nasıl giderim?
GeoJohn
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.