Видаліть блокування класу функцій


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 та Feature Class):

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, але ціною власного виконання.
Міхаліс Авраам

просто цікаво, чому існує два рази існування, я маю на увазі третє твердження, якщо все () у clearWSLocks?
макак

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

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.