Eliminar bloqueo en clase de entidad


11

Cuando intento eliminar una clase de entidad, después o durante el uso de una aplicación de motor Arcgis que usa la misma clase de entidad, recibo un error relacionado con el bloqueo, por lo que no puedo evitarlo hasta que reinicie la computadora.

Me gustaría saber una forma de eliminar los bloqueos usando arcpy o arcobjects 10.1, sería perfecto si puedo obtener el bloqueo dentro de la aplicación arcengine que también bloquea la geodatabase, he visto diferentes publicaciones en SE sobre bloqueos pero nadie de ellos da la solución a los bloqueos libres usando ArcObjects.


1
Tuve una pregunta similar hace un tiempo ( gis.stackexchange.com/q/28977/8104 ). No pude encontrar una respuesta sobre los bloqueos, aunque había buena información sobre la eliminación de objetos en la memoria.
Aaron

Respuestas:


12

Si usa scripts de Arcpy, los problemas de bloqueo de datos se han vuelto aún más problemáticos con 10.1.

Si su código está creando los bloqueos, entonces no está limpiando usted mismo. Libere todas las referencias a clases de entidad, espacios de trabajo, cursores, etc. Los bloqueos se eliminan cuando no tiene más referencias a los objetos que se están bloqueando.

Bueno, esa es la forma en que debería funcionar, pero rara vez lo hace. Por lo general, un código funcionará ocasionalmente, pero a menudo se bloquea inexplicablemente en diferentes lugares.

El problema parece ser que las cerraduras se quedan allí 'por un tiempo', pero el código se ejecuta mucho más rápido que la velocidad a la que se eliminan las cerraduras. Sin embargo, algunas de las herramientas de Arc incorporadas parecen forzar el bloqueo de los bloqueos a pedido (ya que los bloqueos se aplican a GDB completos de una sola vez, un bloqueo le impedirá trabajar con cualquiera de las Clases de entidades contenidas). Estas herramientas son arcpy.Compact_management () y arcpy.Exists ().

Aquí hay una pequeña función que uso dentro de mi código que ha aumentado dramáticamente la confiabilidad (para un script que crea y edita múltiples GDB y clases de características dentro de ellos):

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

Se usa simplemente pasando la ruta del espacio de trabajo (GDB) a la función, y debe hacerse después de cada operación en el espacio de trabajo (es decir, la creación de GDB) o en las clases de entidad dentro del espacio de trabajo (es decir, cursores, agregar campos, cálculos, etc.) . Por ejemplo (se muestra aquí como un script independiente, con la función en la parte superior; para usar la función, cópiela y péguela entre las importaciones y el programa real, como se muestra aquí):

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
Compacto no funciona si hay una cerradura. De hecho, aumentará el rendimiento cuando ejecute muchas operaciones de un FGDB, pero a costa de su propio tiempo de ejecución.
Michalis Avraam

solo me pregunto por qué hay dos veces Existe, me refiero a la tercera declaración en if all () en clearWSLocks?
makak

Puedo estar de acuerdo, no he encontrado esto para borrar las cerraduras. :( y he intentado muchas cosas diferentes hasta ahora.
Vidar


7

Si su código está creando los bloqueos, entonces no está limpiando usted mismo. Libere todas las referencias a clases de entidad, espacios de trabajo, cursores, etc. Los bloqueos se eliminan cuando no tiene más referencias a los objetos que se están bloqueando.


1
Sé que este hilo es bastante antiguo, pero tengo un problema para poder eliminar un FGDB dentro de arcpy. ¿Qué quiere decir exactamente con "Liberar todas las referencias a clases de entidad, espacios de trabajo, cursores, etc." ¿Cómo haría para publicar las referencias mencionadas?
GeoJohn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.