フィーチャクラスのロックを解除


11

同じ機能クラスを使用するArcgisエンジンアプリの使用後または使用中に機能クラスを削除しようとすると、ロックに関するエラーが発生するため、コンピューターを再起動するまでこのロックに乗ることができません。

私はarcpyまたはarcobjects 10.1を使用してロックを削除する方法を知りたいのですが、ジオデータベースをロックするarcengineアプリ内のロックに乗ることができれば完璧でしょうそれらのうち、ArcObjectsを使用してロックを解放するソリューションを提供します。


1
しばらく前に同様の質問がありました(gis.stackexchange.com/q/28977/8104)。メモリオブジェクト内の削除に関する良い情報はありましたが、ロックに関する答えを見つけることができませんでした。
アーロン

回答:


12

Arcpyスクリプトを使用している場合、10.1 ではデータロックの問題がさらに問題になります。

コードによってロックが作成されている場合は、自分でクリーンアップしているわけではありません。フィーチャクラス、ワークスペース、カーソルなどへのすべての参照を解放します。ロックされているオブジェクトへの参照がなくなると、ロックが解除されます。

まあ、それはそれが動作するはずの方法ですが、めったに動作しません。通常、コードは時々動作しますが、多くの場合、さまざまな場所で不可解にクラッシュします。

問題は、ロックが「しばらく」そこに残っているだけのように見えますが、コードはロックが解除される速度よりもはるかに速く実行されます。ただし、組み込みのArcツールのいくつかは、ロックをオンデマンドで強制的にクリアするように見えます(ロックはGDB全体に一度に適用されるため、ロックにより、含まれているフィーチャクラスを操作できなくなります)。これらのツールはarcpy.Compact_management()およびarcpy.Exists()です。

信頼性を劇的に向上させたコード内で使用する小さな関数を次に示します(複数のGDBおよびフィーチャクラスを作成および編集するスクリプトの場合)。

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
ロックがある場合、Compactは機能しません。FGDBの多くの操作を実行するとパフォーマンスは向上しますが、ランタイムが犠牲になります。
ミカリスアヴラム

なぜExistsが2回あるのかと思って、clearWSLocksのif all()の3番目のステートメントを意味しますか?
makak

同意することができますが、ロックを解除するためにこれを見つけていません。:(私はこれまで、多くの異なるものを試してみました。
Vidar


7

コードによってロックが作成されている場合は、自分でクリーンアップしているわけではありません。フィーチャクラス、ワークスペース、カーソルなどへのすべての参照を解放します。ロックされているオブジェクトへの参照がなくなると、ロックが解除されます。


1
このスレッドはかなり古いことは知っていますが、arcpy内でFGDBを削除することができないという問題があります。「フィーチャクラス、ワークスペース、カーソルなどへのすべての参照を解除する」とはどういう意味ですか 上記の参照をリリースするにはどうすればよいですか?
ジオジョン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.