Rimuovere il blocco sulla classe di funzionalità


11

Quando provo a eliminare una classe di funzionalità, dopo o durante l'utilizzo di un'app del motore Arcgis che utilizza la stessa classe di funzionalità, viene visualizzato un errore relativo al blocco, quindi non riesco a utilizzare questo blocco finché non riavvio il computer.

vorrei sapere un modo per rimuovere i blocchi usando arcpy o arcobjects 10.1, sarebbe perfetto se riesco a cavalcare il blocco all'interno dell'app arcengine che blocca anche il geodatabase, ho visto diversi post in SE sui blocchi ma nessuno di questi fornisce la soluzione per bloccare gratuitamente usando ArcObjects.


1
Ho avuto una domanda simile qualche tempo fa ( gis.stackexchange.com/q/28977/8104 ). Non sono riuscito a trovare una risposta sui blocchi, anche se c'erano buone informazioni sull'eliminazione negli oggetti di memoria.
Aaron

Risposte:


12

Se si utilizza lo scripting Arcpy, i problemi di blocco dei dati sono diventati ancora più problematici con 10.1.

Se i blocchi vengono creati dal tuo codice, allora non stai pulendo dopo te stesso. Rilasciare tutti i riferimenti a classi di funzioni, aree di lavoro, cursori, ecc. I blocchi vengono rimossi quando non si hanno più riferimenti agli oggetti bloccati.

Bene, è così che dovrebbe funzionare, ma raramente lo fa. Di solito un codice funzionerà di tanto in tanto, ma spesso si blocca inspiegabilmente in luoghi diversi.

Il problema sembra essere che i blocchi vengono lasciati lì seduti `per un po ', ma il codice viene eseguito molto più velocemente della velocità con cui i blocchi vengono rimossi. Tuttavia, alcuni degli strumenti Arc integrati sembrano forzare la cancellazione dei blocchi su richiesta (poiché i blocchi si applicano a interi GDB contemporaneamente, un blocco ti impedirà di lavorare con una qualsiasi delle Classi di funzioni contenute). Questi strumenti sono arcpy.Compact_management () e arcpy.Exists ().

Ecco una piccola funzione che uso nel mio codice che ha notevolmente aumentato l'affidabilità (per uno script che crea e modifica più GDB e classi di caratteristiche al loro interno):

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

Viene utilizzato semplicemente passando il percorso dell'area di lavoro (GDB) alla funzione e dovrebbe essere eseguito dopo ogni operazione sull'area di lavoro (ad es. Creazione GDB) o Classi di caratteristiche all'interno dell'area di lavoro (ad es. Cursori, aggiunta di campi, calcoli, ecc.) . Ad esempio (mostrato qui come uno script autonomo, con la funzione in alto; per usare la funzione, copiarlo e incollarlo tra le importazioni e il programma effettivo, come mostrato qui):

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
Compatto non funziona se è presente un lucchetto. Aumenterà davvero le prestazioni quando si eseguono molte operazioni di un FGDB, ma a costo del suo tempo di esecuzione.
Michalis Avraam,

mi chiedo solo perché esiste due volte Esiste, intendo la terza istruzione in if all () in clearWSLocks?
Makak,

Posso concordare, non ho trovato questo per cancellare i blocchi. :( e finora ho provato molte cose diverse.
Vidar,


7

Se i blocchi vengono creati dal tuo codice, allora non stai pulendo dopo te stesso. Rilasciare tutti i riferimenti a classi di funzioni, aree di lavoro, cursori, ecc. I blocchi vengono rimossi quando non si hanno più riferimenti agli oggetti bloccati.


1
So che questo thread è piuttosto vecchio, ma ho un problema con la possibilità di eliminare un FGDB in arcpy. Cosa intendi esattamente con "Rilascia tutti i riferimenti a classi di funzioni, aree di lavoro, cursori, ecc." Come farei per rilasciare questi riferimenti?
GeoJohn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.