ArcGIS“ in_memory”ワークスペースの適切な構文と使用法は何ですか?


33

in_memoryArcGISでワークスペースを最適に使用する方法がわかりません。このテーマで見つけた最良のリソースは、ESRIの「インメモリワークスペースの使用」です。残念ながら、ヘルプセクションはあまり有益ではありません。また、このサイトには、ここここのテーマについて簡単に触れた投稿があります

私の特定の質問:

  • in_memoryArcGIS / arcpyベースのスクリプトでワークスペースを使用するための適切な使用法と構文は何ですか?
  • あるin_memoryワークスペースは、例えば、使用してレイヤーを作成し、同じarcpy.MakeFeatureLayer_management()
  • in_memoryスクリプトの最後にワークスペースを削除するなどの標準はありますか?

回答:


41

私はかなり最近「in_memory」を使用しています。特定のタスクの処理速度を劇的に向上させる可能性があるため、非常に便利ですが、非常に大きなデータセットを使用している場合、プログラムがクラッシュする可能性があります。

「in_memory」を使用してプロセス出力を定義できます...多くの場合、フィーチャクラスでタスクを実行している場合は、まず「in_memory」ワークスペースにコピーします。

inFeature = r'C:\myDir.gdb\myFeature'
memoryFeature = "in_memory" + "\\" + "myMemoryFeature"
arcpy.CopyFeatures_management(inFeature, memoryFeature)

memoryFeatureを一緒に連結する必要はないことに注意してください。「in_memory \ myMemoryFeature」と書き出すことができます。「in_memory」と物理ディレクトリを簡単に切り替えられるようにするだけです。その後、メモリ内の機能に対してプロセスを実行できます。完了したら、プロセスを逆にしてディレクトリに保存できます。

私は間違っている可能性がありますが、フィーチャレイヤーを作成することと同じではないと思います。フィーチャレイヤーを使用すると、選択方法やその他のレイヤー固有の操作にアクセスできます。「in_memory」ディレクトリは、ラスタオブジェクトに相当するベクトルと考えてください(raster = arcpy.Raster(myRasterLocation))

「in_memory」の使用後にクリーンアップするには、次のコード行を追加するだけです。

arcpy.Delete_management("in_memory")

お役に立てば幸いです。


3
@egdettiに同意します。これは非常に便利で非常に強力であり、処理を大幅に高速化します。ただし、ワークスペース/レイヤーを削除する必要はありません。アプリケーションを閉じると自動的にクリーンアップされます。ただし、前述したように、in_memoryワークスペースに多くのデータがあるためにRAMが不足している場合は、arcpy.Deleteを実行すると便利です(必要な場合があります)。
ライアンダルトン

12

それほど多くはありません。ジオプロセシングツールでアクセスできる魔法のディレクトリと、名前の付いたアークピーカーソルがあります。in_memoryます。あなたのような何かをしたいarcpy.management.CreateTable('in_memory', 'my_new_table')か、CreateFeatureClass新しいフィーチャクラスまたはテーブルを作成します。次に、そのプロセスにpathを持つ新しいテーブルを作成しますin_memory\my_new_table。arcmapを使用している場合、それにアクセスmy_new_tableするためのショートカットとして使用できる名前の付いた目次にテーブルビューを追加します。メモリテーブル内の一時的なものである場合arcpy.management.Delete(r'in_memory\my_new_table')は、スクリプトの最後で使い終わったときに使用します。


9

少し話題から外れていますが、指摘する価値があると思います。まず、上記の@JasonScheirerと@egdettiの両方in_memoryが非常に役立つことに同意します。最大の注意点は、in_memoryワークスペースがラスターデータをサポートしていないことです。これが問題になる場合は、Python tempfileモジュールを使用することをお勧めします。これはそれほど高速ではありませんが、より信頼性があります。たとえば、次のようなことができます。

import arcpy
import tempfile
import os.path
import shutil

try:
    temp_dir = tempfile.mkdtemp()
    temp_gdb = "temp.gdb"
    arcpy.CreateFileGDB_management(temp_dir, temp_gdb)
    arcpy.env.workspace = os.path.join(temp_dir, temp_gdb)

    #Some processing...

except Exception, e:
    #handle exceptions here
    print e
finally:
    shutil.rmtree(temp_dir, True)

2
arcpyには、arcpy.Raster()メソッドで組み込まれたラスターを処理する方法があります。myRaster = arcpy.Raster( "C:\ RasteLocation")などの変数を定義することにより、マップ代数計算およびその他のさまざまなラスター操作で簡単に使用できるラスターオブジェクトをメモリに作成します。このようなラスターオブジェクトの保存は、myRaster.save( "C:\ SaveLocation")に書き込むのと同じくらい簡単です。arcpyがテーブルにもたらす非常に便利な機能。
ブルーフット

@egdettiフェアコール。しかし、それがより大きなデータセットをどのように処理するかを知りたいです。
om_henners

1
@mbenedetti-Rasterオブジェクトは、可能な限り遅くラスターをarcpy scratchワークスペースに書き込みます。これにより、arcpyはシングルセル処理ツール(「+」など)を単一の実行プロセスにスタックすることでI / Oを最適化できます、 例えば。save()メソッドは、ラスター処理の実行を強制します。
カーティス価格

3
@om_henners in_memoryは、ArcGIS 10.1のラスターをサポートしています。
カーティス価格

2
@om_henners arcpyは、スクラッチ名を作成するツールを提供します。たとえば、フォルダー内のスクラッチフィーチャクラスに「.shp」が自動的に追加されるという利点があります。メソッドはarcpy.CreateScratchName()です。
カーティス価格
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.