Удалить блокировку на классе объектов


11

Когда я пытаюсь удалить класс пространственных объектов, после или во время использования приложения движка Arcgis, которое использует тот же класс пространственных объектов, у меня появляется ошибка, связанная с блокировкой, поэтому я не могу использовать эту блокировку, пока не перезапущу компьютер.

я хотел бы знать способ удаления блокировок с использованием arcpy или arcobjects 10.1, было бы идеально, если бы я мог использовать блокировку внутри приложения arcengine, которое также блокирует базу геоданных, я видел разные сообщения в SE о блокировках, но никто из них дает решение освободить блокировки с помощью ArcObjects.


1
У меня был похожий вопрос некоторое время назад ( gis.stackexchange.com/q/28977/8104 ). Мне не удалось найти ответ о блокировках, хотя была хорошая информация об удалении в памяти объектов.
— Аарон

Ответы:


12

Если вы используете скрипты Arcpy, проблемы с блокировкой данных стали еще более проблематичными с 10.1.

Если блокировки создаются вашим кодом, то вы не убираете за собой. Отпустите все ссылки на классы пространственных объектов, рабочие области, курсоры и т. Д. Блокировки удаляются, когда у вас больше нет ссылок на блокируемые объекты.

Ну, это так, как это должно работать, но это редко работает. Обычно код будет работать время от времени, но часто неожиданно падает в разных местах.

Похоже, проблема заключается в том, что блокировки просто остаются на некоторое время «ненадолго», но код работает намного быстрее, чем скорость, с которой снимаются блокировки. Тем не менее, некоторые из встроенных инструментов Arc, по-видимому, требуют очистки блокировок по требованию (поскольку блокировки применяются ко всем GDB одновременно, блокировка не позволит вам работать с любым из содержащихся классов объектов). Эти инструменты являются arcpy.Compact_management () и arcpy.Exists ().

Вот небольшая функция, которую я использую в своем коде, что значительно повысило надежность (для скрипта, который создает и редактирует несколько GDB и классов объектов внутри них):

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

Он используется путем простой передачи пути к рабочему пространству (GDB) в функцию, и его следует выполнять после каждой операции с рабочим пространством (т. Е. Созданием GDB) или классами объектов в рабочем пространстве (т. Е. Курсорами, добавлением полей, вычислениями и т. Д.). , Например (показан здесь как автономный скрипт с функцией вверху; чтобы использовать функцию, скопируйте ее и вставьте между импортом и реальной программой, как показано здесь):

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
Компакт не работает, если есть замок. Это действительно увеличит производительность, когда вы выполняете много операций FGDB, но за счет собственного времени выполнения.
— Михалис Авраам

просто интересно, почему существует два раза Exists, я имею в виду третье утверждение в if all () в clearWSLocks?
— Макак

Я могу согласиться, я не нашел это, чтобы очистить замки. :( и я уже пробовал много разных вещей.
— Видар

8

Файловая база геоданных имеет 3 типа блокировок.

  1. SR - схема блокировки
  2. RD - чтение блокировки
  3. ED - редактировать блокировку

Предлагаемое решение по @StacyR будет работать во всех ситуациях , кроме исключительных редактирования замков (ED) в соответствии с ARCGIS справочной документации.

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//003n0000007t000000


7

Если блокировки создаются вашим кодом, то вы не убираете за собой. Отпустите все ссылки на классы пространственных объектов, рабочие области, курсоры и т. Д. Блокировки удаляются, когда у вас больше нет ссылок на блокируемые объекты.


1
Я знаю, что эта ветка довольно старая, но у меня возникла проблема с возможностью удаления FGDB внутри arcpy. Что именно вы подразумеваете под "Отпустите все ссылки на классы пространственных объектов, рабочие области, курсоры и т. Д." Как бы я выпустил упомянутые ссылки?
— GeoJohn
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.