Remover bloqueio na classe de recurso

11

Quando tento excluir uma classe de recurso, após ou durante o uso de um aplicativo de mecanismo Arcgis que usa a mesma classe de recurso, recebo um erro referente ao bloqueio, por isso não posso usar esse bloqueio até reiniciar o computador.

Eu gostaria de saber uma maneira de remover bloqueios usando o arcpy ou arcobjects 10.1, seria perfeito se eu pudesse usar o bloqueio dentro do aplicativo arcengine, que também bloqueia o banco de dados geográficos, eu vi posts diferentes no SE sobre bloqueios, mas ninguém deles fornece a solução para liberar bloqueios usando o ArcObjects.

geogeek
fonte
1
Eu tive uma pergunta semelhante há um tempo ( gis.stackexchange.com/q/28977/8104 ). Não consegui encontrar uma resposta sobre os bloqueios, apesar de haver boas informações sobre a exclusão de objetos de memória.
Aaron

Respostas:

12

Se você estiver usando scripts do Arcpy, os problemas de bloqueio de dados se tornam ainda mais problemáticos com a 10.1.

Se os bloqueios estiverem sendo criados pelo seu código, você não estará limpando a si mesmo. Libere todas as referências a classes de recursos, áreas de trabalho, cursores etc. Os bloqueios serão removidos quando você não tiver mais referências aos objetos que estão sendo bloqueados.

Bem, é assim que deve funcionar, mas raramente funciona. Geralmente, um código funciona ocasionalmente, mas geralmente falha inexplicavelmente em lugares diferentes.

O problema parece ser que os bloqueios são deixados ali "por um tempo", mas o código é executado muito mais rápido que a velocidade na qual os bloqueios são removidos. No entanto, algumas das ferramentas incorporadas do Arc parecem forçar os bloqueios a serem limpos sob demanda (como os bloqueios se aplicam a GDBs inteiros de uma só vez, um bloqueio impedirá que você trabalhe com qualquer uma das Classes de recursos contidas). Essas ferramentas são arcpy.Compact_management () e arcpy.Exists ().

Aqui está uma pequena função que eu uso no meu código que aumentou drasticamente a confiabilidade (para um script que cria e edita vários GDBs e classes de recursos dentro deles):

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

É usado simplesmente passando o caminho do espaço de trabalho (GDB) para a função e deve ser feito após todas as operações no espaço de trabalho (por exemplo, criação do GDB) ou nas Classes de recursos dentro do espaço de trabalho (por exemplo, cursores, adição de campos, cálculos etc.) . Por exemplo (mostrado aqui como um script independente, com a função na parte superior; para usar a função, copie-a e cole-a entre as importações e o programa real, como mostrado aqui):

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
fonte
3
O Compact não funciona se houver uma trava. De fato, aumentará o desempenho quando você executar muitas operações de um FGDB, mas ao custo de seu próprio tempo de execução.
Michalis Avraam
apenas querendo saber por que existe duas vezes, quero dizer a terceira declaração em if all () no clearWSLocks?
makak
Posso concordar, não encontrei isso para limpar bloqueios. :( e eu tentei muitas coisas diferentes até agora.
Vidar
7

Se os bloqueios estiverem sendo criados pelo seu código, você não estará limpando a si mesmo. Libere todas as referências a classes de recursos, áreas de trabalho, cursores etc. Os bloqueios serão removidos quando você não tiver mais referências aos objetos que estão sendo bloqueados.

blah238
fonte
1
Eu sei que esse segmento é bastante antigo, mas estou tendo um problema ao poder excluir um FGDB no arcpy. O que exatamente você quer dizer com "Liberar todas as referências a classes de recursos, áreas de trabalho, cursores etc." Como eu divulgaria essas referências?
GeoJohn