Quelle est la syntaxe et l'utilisation appropriées pour l'espace de travail «in_memory» d'ArcGIS?

33

Je ne vois pas comment utiliser au mieux l' in_memoryespace de travail dans ArcGIS. La meilleure ressource que j'ai trouvée sur le sujet provient d'ESRI sur Utilisation de l'espace de travail en mémoire . Malheureusement, la section d'aide n'est pas très informative. En outre, il y a un post sur ce site qui aborde brièvement le sujet ici et ici .

Mes questions spécifiques:

  • Quelle est l'utilisation et la syntaxe appropriées pour utiliser un in_memoryespace de travail dans des scripts basés sur ArcGIS / arcpy?
  • L' in_memoryespace de travail est -il identique à, par exemple, créer un calque avec arcpy.MakeFeatureLayer_management()?
  • Existe-t-il des normes telles que la suppression d'un in_memoryespace de travail à la fin du script?
Aaron
la source

Réponses:

41

J'ai utilisé "in_memory" un peu récemment. Cela peut être très utile, car il pourrait augmenter considérablement la vitesse de traitement de certaines tâches. Toutefois, si vous travaillez avec de très grands ensembles de données, votre programme risque de tomber en panne.

Vous pouvez utiliser "in_memory" pour définir les résultats de processus ... souvent, si je suis en train d'exécuter une tâche sur une classe d'entités, je vais d'abord la copier dans l'espace de travail "in_memory":

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

Notez que vous ne devez pas concaténer mémoireFeature ensemble comme je le faisais, vous pouvez l'écrire comme "in_memory \ myMemoryFeature", j'aime juste le faire de cette façon pour basculer facilement entre "in_memory" et un répertoire physique. Vous pouvez ensuite exécuter des processus sur votre entité en mémoire. Lorsque vous avez terminé, vous pouvez inverser le processus pour le sauvegarder dans un répertoire.

Je peux me tromper, mais je pense que ce n'est pas la même chose que de créer une couche d'entités. Les couches d'entités vous donnent accès aux méthodes de sélection et à d'autres opérations spécifiques aux couches. Considérez le répertoire "in_memory" comme le vecteur équivalent à l'objet raster (raster = arcpy.Raster (myRasterLocation)).

Pour nettoyer après avoir utilisé "in_memory", ajoutez simplement la ligne de code suivante:

arcpy.Delete_management("in_memory")

J'espère que ça t'as aidé.

pied bleu
la source
3
Je suis d'accord avec @egdetti. Il est très utile, très puissant et accélère considérablement le traitement. Cependant, vous n'avez pas besoin de supprimer l'espace de travail / la couche, car elle se nettoie d'elle-même lorsque vous fermez l'application. Comme mentionné précédemment, exécuter l'arcpy.Delete peut s'avérer utile (parfois nécessaire) si vous manquez de mémoire vive (RAM), car vous avez trop d' éléments dans l'espace de travail in_memory.
RyanDalton
12

Il n'y a pas grand-chose à cela. Il existe un répertoire magique auquel vous pouvez accéder dans les outils de géotraitement et les curseurs Arcpy nommés in_memory. Vous feriez quelque chose comme arcpy.management.CreateTable('in_memory', 'my_new_table')ou CreateFeatureClasspour faire une nouvelle classe ou un nouveau tableau. Ensuite, vous avez une nouvelle table dans ce processus avec le chemin in_memory\my_new_table, si vous êtes dans arcmap, il ajoutera une vue sous forme de table à la table des matières nommée my_new_tableque vous pouvez utiliser comme raccourci pour y accéder. S'il s'agit d'une table temporaire en mémoire, utilisez-la arcpy.management.Delete(r'in_memory\my_new_table')lorsque vous en avez terminé à la fin de votre script.

Jason Scheirer
la source
9

Légèrement hors sujet, mais je pense que cela vaut la peine d'être signalé. Tout d'abord, je suis d'accord avec @JasonScheirer et @egdetti ci-dessus, cela in_memorypeut être très utile. La chose la plus importante à noter est que l’ in_memoryespace de travail ne prend pas en charge les données raster. Si cela devenait un problème, je recommanderais le tempfilemodule Python . Ce ne sera pas aussi rapide, mais plus fiable. Par exemple, vous pourriez faire quelque chose comme:

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)
om_henners
la source
2
arcpy a un moyen de traiter les rasters intégrés à la méthode arcpy.Raster (). En définissant une variable telle que myRaster = arcpy.Raster ("C: \ RasteLocation"), vous créez un objet raster en mémoire pouvant être utilisé dans des calculs d'algèbre cartographique et diverses autres opérations raster. L'enregistrement d'un tel objet raster est aussi simple que d'écrire dans myRaster.save ("C: \ SaveLocation"). Une fonctionnalité très utile que Arcpy apporte à la table.
Bluefoot
@egdetti fair call. Je suis curieux de savoir comment il gère les grands ensembles de données.
om_henners
1
@mbenedetti - l'objet Raster écrit un raster dans l'espace de travail arcpy scratch - aussi tard que possible, ce qui permet à arcpy d'optimiser les E / S en empilant des outils de traitement à cellule unique (comme "+" par exemple) dans un seul processus d'exécution , par exemple. La méthode save () forcera l'exécution du traitement du raster.
Curtis Price le
3
@om_henners in_memory prend en charge les rasters dans ArcGIS 10.1!
Curtis Price le
2
@om_henners arcpy fournit un outil pour créer des noms de travail, ce qui présente des avantages en ce que, par exemple, une classe d'entités de travail dans un dossier est automatiquement complétée par ".shp". La méthode est arcpy.CreateScratchName ().
Curtis Price le