ArcGIS "in_memory" कार्यक्षेत्र के लिए उचित वाक्यविन्यास और उपयोग क्या है?


33

मैं स्पष्ट नहीं हूँ कि in_memoryआर्कजीआईएस में कार्यक्षेत्र का उपयोग करना सबसे अच्छा कैसे है । इस विषय पर मुझे जो सबसे अच्छा संसाधन मिला है वह ईएसआरआई से इन-मेमोरी वर्कस्पेस का उपयोग करने पर है । दुर्भाग्य से, सहायता अनुभाग बहुत जानकारीपूर्ण नहीं है। साथ ही, इस साइट पर एक पोस्ट है जो कि यहां और यहां के विषय पर संक्षिप्त रूप से स्पर्श करता है

मेरे विशिष्ट प्रश्न:

  • in_memoryआर्कजीस / आर्कपी आधारित स्क्रिप्ट में कार्यक्षेत्र का उपयोग करने के लिए उचित उपयोग और वाक्यविन्यास क्या है ?
  • क्या 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)

ध्यान दें कि आपको मैमोरीफ्रीचर को एक साथ मिलाना नहीं है जैसे मैंने किया था, आप इसे "in_memory \ myMemoryFeature" के रूप में लिख सकते हैं, मैं बस इसे "in_memory" और एक भौतिक निर्देशिका के बीच आगे और पीछे स्विच करने का तरीका पसंद करता हूं। आप स्मृति में अपनी सुविधा पर प्रक्रिया कर सकते हैं। जब आप कर लेते हैं, तो आप इसे वापस एक निर्देशिका में सहेजने के लिए प्रक्रिया को उल्टा कर सकते हैं।

मैं गलत हो सकता हूं, लेकिन मेरा मानना ​​है कि यह फीचर लेयर बनाने जैसा नहीं है। फीचर लेयर्स आपको चयन के तरीकों और अन्य लेयर स्पेसिफिक ऑपरेशंस तक पहुंच प्रदान करते हैं। "In_memory" डायरेक्टरी को रैस्टर ऑब्जेक्ट (raster = arcpy.Raster (myRasterLocation)) के बराबर वेक्टर के रूप में सोचें

"In_memory" का उपयोग करने के बाद सफाई करने के लिए बस कोड की निम्नलिखित पंक्ति जोड़ें:

arcpy.Delete_management("in_memory")

उम्मीद है की वो मदद करदे।


3
मैं @egdetti से सहमत हूं। यह बहुत उपयोगी है, बहुत शक्तिशाली है, और प्रसंस्करण में काफी तेजी लाता है। आपको वास्तव में कार्यक्षेत्र / परत को हटाने की आवश्यकता नहीं है, हालांकि, जब आप एप्लिकेशन को बंद करते हैं तो यह खुद को साफ कर देगा। जैसा कि उल्लेख किया गया था, हालांकि, चापलूसी को चलाना। कभी-कभी आप अपने आप को रैम से बाहर निकलते हुए मददगार (कभी-कभी आवश्यक) हो सकते हैं क्योंकि आपके पास in_memory कार्यक्षेत्र में बहुत अधिक सामान है।
रयानडाल्टन

12

इसमें बहुत कुछ नहीं है। वहाँ एक जादू निर्देशिका है जिसे आप जियोप्रोसेसिंग टूल और नाम से जाने जाने वाले कर्सर पर एक्सेस कर सकते हैं in_memory। आप ऐसा कुछ करना चाहते हैं arcpy.management.CreateTable('in_memory', 'my_new_table')या CreateFeatureClassएक नई सुविधा या तालिका बनाना चाहते हैं। फिर आपके पास पथ के साथ उस प्रक्रिया में एक नई तालिका है 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कार्यक्षेत्र रेखापुंज डेटा का समर्थन नहीं करता है। यदि यह एक मुद्दा बन जाता है तो मैं पायथन 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
आर्कपी के पास आर्कियो.पास्टर () पद्धति से निर्मित चूहों से निपटने का एक तरीका है। MyRaster = arcpy.Raster ("C: \ RasteLocation") जैसे चर को परिभाषित करके, आप मेमोरी में एक रास्टर ऑब्जेक्ट बनाते हैं जिसका उपयोग मैप बीजगणित गणना और विभिन्न अन्य रेखापुंज संचालन में आसानी से किया जा सकता है। इस तरह के रास्टर ऑब्जेक्ट को सहेजना myRaster.save ("C: \ SaveLocation") में लिखने जितना आसान है। एक बहुत ही उपयोगी विशेषता जो आर्कपी टेबल पर लाती है।
ब्लूफूट

@egdetti मेला कॉल। मैं यह जानने के लिए उत्सुक हूं कि यह बड़े डेटासेट को कैसे संभालता है।
om_henners

1
@mbenedetti - रेखापुंज वस्तु आर्कषक खरोंच कार्यक्षेत्र के लिए एक रेखापुंज लिखती है - जितनी देर हो सके उतनी देर हो सकती है, जो एकल-कोशिका प्रसंस्करण उपकरण (उदाहरण के लिए "+" की तरह स्टैकिंग करके चापलूस को I / O को अनुकूलित करने की अनुमति देता है) , उदाहरण के लिए। सेव () विधि रैस्टर प्रोसेसिंग के निष्पादन को बाध्य करेगी।
कर्टिस प्राइस

3
ArcomIS 10.1 में @om_henners_memory आपदाओं का समर्थन करता है!
कर्टिस मूल्य

2
@om_henners arcpy खरोंच नाम बनाने के लिए एक उपकरण प्रदान करता है, जिसमें इसके फायदे हैं कि उदाहरण के लिए एक फ़ोल्डर में एक खरोंच सुविधा वर्ग स्वचालित रूप से ".shp" है। यह विधि चापलूसी है। CreateScratchName ()।
कर्टिस प्राइस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.