Supprimer le verrouillage de la classe d'entités

11

Lorsque j'essaie de supprimer une classe d'entités, après ou pendant l'utilisation d'une application de moteur Arcgis qui utilise la même classe d'entités, j'ai une erreur concernant le verrou, donc je ne peux pas me débarrasser de ce verrou avant de redémarrer l'ordinateur.

j'aimerais savoir comment supprimer les verrous à l'aide d'arcpy ou d'arcobjects 10.1, ce serait parfait si je peux me débarrasser de la serrure à l'intérieur de l'application arcengine qui verrouille également la géodatabase, j'ai vu différents articles en SE sur les verrous mais personne d'entre eux donne la solution pour libérer les verrous à l'aide d'ArcObjects.

geogeek
la source
1
J'avais une question similaire il y a quelque temps ( gis.stackexchange.com/q/28977/8104 ). Je n'ai pas pu trouver de réponse sur les verrous, bien qu'il y ait de bonnes informations sur la suppression des objets en mémoire.
Aaron

Réponses:

12

Si vous utilisez les scripts Arcpy, les problèmes de verrouillage des données sont devenus encore plus problématiques avec 10.1.

Si les verrous sont créés par votre code, vous ne nettoyez pas après vous-même. Libérez toutes les références aux classes d'objets, espaces de travail, curseurs, etc. Les verrous sont supprimés lorsque vous n'avez plus de références aux objets à verrouiller.

Eh bien, c'est ainsi que cela devrait fonctionner, mais c'est rarement le cas. Habituellement, un code fonctionnera occasionnellement, mais plantera souvent de manière inexplicable à différents endroits.

Le problème semble être que les verrous sont juste laissés assis là «pendant un certain temps», mais le code s'exécute beaucoup plus rapidement que la vitesse à laquelle les verrous sont retirés. Cependant, certains des outils Arc intégrés semblent forcer la suppression des verrous à la demande (car les verrous s'appliquent à des GDB entiers en même temps, un verrou vous empêchera de travailler avec l'une des classes d'entités contenues). Ces outils sont arcpy.Compact_management () et arcpy.Exists ().

Voici une petite fonction que j'utilise dans mon code qui a considérablement augmenté la fiabilité (pour un script qui crée et édite plusieurs GDB et classes d'entités en leur sein):

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

Il est utilisé en passant simplement le chemin de l'espace de travail (GDB) à la fonction, et doit être effectué après chaque opération sur l'espace de travail (par exemple, création de GDB) ou sur les classes d'entités dans l'espace de travail (par exemple, curseurs, ajout de champs, calculs, etc.) . Par exemple (affiché ici en tant que script autonome, avec la fonction en haut; pour utiliser la fonction, copiez-la et collez-la entre les importations et le programme réel, comme indiqué ici):

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
la source
3
Compact ne fonctionne pas s'il y a un verrou. Il augmentera en effet les performances lorsque vous exécutez de nombreuses opérations d'un FGDB, mais au détriment de son propre runtime.
Michalis Avraam
Je me demande juste pourquoi il y a deux fois Exists, je veux dire la troisième déclaration de if all () dans clearWSLocks?
makak
Je peux être d'accord, je n'ai pas trouvé cela pour effacer les serrures. :( et j'ai essayé beaucoup de choses différentes jusqu'à présent.
Vidar
7

Si les verrous sont créés par votre code, vous ne nettoyez pas après vous-même. Libérez toutes les références aux classes d'objets, espaces de travail, curseurs, etc. Les verrous sont supprimés lorsque vous n'avez plus de références aux objets à verrouiller.

blah238
la source
1
Je sais que ce fil est assez ancien, mais j'ai un problème avec la possibilité de supprimer un FGDB dans arcpy. Qu'entendez-vous exactement par "Libérer toutes les références aux classes d'entités, espaces de travail, curseurs, etc." Comment pourrais-je procéder pour publier lesdites références?
GeoJohn