Usuń blokadę na klasie elementów

11

Kiedy próbuję usunąć klasę funkcji, po lub podczas korzystania z aplikacji silnika Arcgis, która korzysta z tej samej klasy funkcji, pojawia się błąd dotyczący blokady, więc nie mogę uruchomić tej blokady, dopóki nie uruchomię ponownie komputera.

chciałbym poznać sposób usuwania zamków za pomocą arcpy lub arcobjects 10.1, byłoby idealnie, gdybym mógł jeździć zamkiem w aplikacji arcengine, która również blokuje geobazę, widziałem różne posty w SE na temat zamków, ale nikt nie z nich daje rozwiązanie darmowych blokad za pomocą ArcObjects.

geogeek
źródło
1
Jakiś czas temu miałem podobne pytanie ( gis.stackexchange.com/q/28977/8104 ). Nie udało mi się znaleźć odpowiedzi na temat blokad, chociaż były dobre informacje na temat usuwania obiektów pamięci.
Aaron

Odpowiedzi:

12

Jeśli używasz skryptów Arcpy, problemy z blokadą danych stały się jeszcze bardziej problematyczne w 10.1.

Jeśli blokady są tworzone przez Twój kod, to nie czyścisz po sobie. Zwolnij wszystkie odwołania do klas obiektów, obszarów roboczych, kursorów itp. Blokady są usuwane, gdy nie ma już żadnych odniesień do blokowanych obiektów.

Cóż, tak to powinno działać, ale rzadko tak jest. Zwykle kod działa od czasu do czasu, ale często ulega awarii w niewytłumaczalny sposób w różnych miejscach.

Problem wydaje się polegać na tym, że zamki pozostają tam „na chwilę”, ale kod działa znacznie szybciej niż prędkość, z jaką zamki są usuwane. Jednak niektóre z wbudowanych narzędzi Arc wydają się wymuszać usuwanie blokad na żądanie (ponieważ blokady dotyczą wszystkich całych GDB naraz, blokada uniemożliwi pracę z dowolną zawartą klasą funkcji). Te narzędzia to arcpy.Compact_management () i arcpy.Exists ().

Oto mała funkcja, której używam w moim kodzie, która ma radykalnie zwiększoną niezawodność (dla skryptu, który tworzy i edytuje wiele GDB i klas funkcji w nich zawartych):

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

Służy do tego po prostu przekazując ścieżkę obszaru roboczego (GDB) do funkcji i należy go wykonać po każdej operacji w obszarze roboczym (tj. Tworzenie GDB) lub klasach funkcji w obszarze roboczym (tj. Kursory, dodawanie pól, obliczenia itp.) . Na przykład (pokazany tutaj jako samodzielny skrypt, z funkcją u góry; aby użyć funkcji, skopiuj go i wklej między importem a rzeczywistym programem, jak pokazano tutaj):

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....
StacyR
źródło
3
Kompakt nie działa, jeśli jest zamek. Rzeczywiście zwiększy wydajność, gdy uruchomisz wiele operacji FGDB, ale kosztem własnego środowiska wykonawczego.
Michalis Avraam
Zastanawiam się tylko, dlaczego istnieją dwa razy Istnienie, mam na myśli trzecią instrukcję if all () w clearWSLocks?
makak
Mogę się zgodzić, nie znalazłem tego, aby usunąć zamki. :( i próbowałem do tej pory wielu różnych rzeczy.
Vidar
7

Jeśli blokady są tworzone przez Twój kod, to nie czyścisz po sobie. Zwolnij wszystkie odwołania do klas obiektów, obszarów roboczych, kursorów itp. Blokady są usuwane, gdy nie ma już żadnych odniesień do blokowanych obiektów.

blah238
źródło
1
Wiem, że ten wątek jest dość stary, ale mam problem z usunięciem FGDB w Arcpy. Co dokładnie rozumiesz przez „Uwolnij wszystkie odniesienia do klas obiektów, obszarów roboczych, kursorów itp.” Jak miałbym zacząć wypuszczać wspomniane referencje?
GeoJohn,