ไวยากรณ์และการใช้งานที่เหมาะสมสำหรับเวิร์กสเปซ ArcGIS“ in_memory” คืออะไร?


33

ฉันไม่ชัดเจนว่าจะใช้in_memoryพื้นที่ทำงานใน ArcGIS อย่างไรดีที่สุด ทรัพยากรที่ดีที่สุดที่ฉันได้พบเกี่ยวกับเรื่องนี้จาก ESRI ในการใช้พื้นที่ทำงานในหน่วยความจำ น่าเสียดายที่ส่วนช่วยเหลือไม่ได้ให้ข้อมูลมากนัก นอกจากนี้ยังมีการโพสต์บนเว็บไซต์นี้ว่าในเวลาสั้น ๆ สัมผัสกับเรื่องที่นี่และที่นี่

คำถามเฉพาะของฉัน:

  • การใช้งานและไวยากรณ์ที่เหมาะสมสำหรับการใช้in_memoryพื้นที่ทำงานในสคริปต์ที่ใช้ArcGIS / 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)

โปรดทราบว่าคุณไม่จำเป็นต้องเชื่อมต่อหน่วยความจำคุณลักษณะร่วมกันเหมือนฉันคุณสามารถเขียนมันออกมาเป็น "in_memory \ myMemoryFeature" ฉันแค่ทำแบบนั้นเพื่อสลับไปมาระหว่าง "in_memory" และไดเรกทอรีทางกายภาพได้อย่างง่ายดาย จากนั้นคุณสามารถดำเนินการกับคุณสมบัติของคุณในหน่วยความจำ เมื่อเสร็จแล้วคุณสามารถกลับกระบวนการเพื่อบันทึกกลับไปยังไดเรกทอรี

ฉันอาจผิด แต่ฉันเชื่อว่ามันไม่เหมือนกับการสร้างเลเยอร์คุณลักษณะ ชั้นคุณลักษณะให้คุณเข้าถึงวิธีการเลือกและการดำเนินการเฉพาะชั้นอื่น ๆ คิดว่าไดเรกทอรี "in_memory" เป็นเวกเตอร์เทียบเท่ากับวัตถุแรสเตอร์ (raster = arcpy.Raster (myRasterLocation))

หากต้องการล้างข้อมูลหลังจากใช้ "in_memory" เพียงเพิ่มบรรทัดของรหัสต่อไปนี้:

arcpy.Delete_management("in_memory")

หวังว่าจะช่วย


3
ฉันเห็นด้วยกับ @egdetti มันมีประโยชน์มากมีประสิทธิภาพมากและเร่งความเร็วการประมวลผลอย่างมาก คุณไม่จำเป็นต้องลบเวิร์กสเปซ / เลเยอร์ แต่อย่างใดเนื่องจากมันจะล้างตัวเองเมื่อคุณปิดแอปพลิเคชัน ดังที่ได้กล่าวไว้ว่าการใช้งาน arcpy การลบอาจมีประโยชน์ (บางครั้งจำเป็น) ถ้าคุณพบว่าตัวเองขาด RAM เพราะคุณมีสิ่งต่าง ๆมากเกินไปในพื้นที่ทำงาน in_memory
RyanDalton

12

มีไม่มากไป มีไดเรกทอรีมายากลที่คุณสามารถเข้าถึงใน Geoprocessing เครื่องมือและเคอร์เซอร์ arcpy in_memoryชื่อเป็น คุณต้องการทำบางสิ่งบางอย่างarcpy.management.CreateTable('in_memory', 'my_new_table')หรือCreateFeatureClassเพื่อสร้าง featureclass หรือตารางใหม่ จากนั้นคุณจะมีตารางใหม่ในกระบวนการนั้นพร้อมกับพา ธ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โมดูลPython สิ่งนี้จะไม่เร็ว แต่มีความน่าเชื่อถือมากกว่า ตัวอย่างเช่นคุณสามารถทำสิ่งที่ชอบ:

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 มีวิธีจัดการกับ rasters ในตัวด้วยวิธี arcpy.Raster () โดยการกำหนดตัวแปรเช่น myRaster = arcpy.Raster ("C: \ RasteLocation") คุณสร้างวัตถุแรสเตอร์ในหน่วยความจำที่สามารถใช้ในการคำนวณพีชคณิตแผนที่และการดำเนินการเชิงภาพอื่น ๆ ได้อย่างง่ายดาย การบันทึกวัตถุแรสเตอร์เช่นนั้นง่ายพอ ๆ กับการเขียนใน myRaster.save ("C: \ SaveLocation") คุณสมบัติที่มีประโยชน์มากที่ arcpy นำมาสู่ตาราง
bluefoot

@egdetti โทรยุติธรรม ฉันอยากรู้ว่าจะจัดการชุดข้อมูลขนาดใหญ่ได้อย่างไร
om_henners

1
@mbenedetti - วัตถุ Raster เขียนแรสเตอร์ไปยังพื้นที่ทำงานรอยขีดข่วน arcpy - ดึกที่สุดเท่าที่จะเป็นไปได้ซึ่งช่วยให้ arcpy เพิ่มประสิทธิภาพ I / O โดยการซ้อนเครื่องมือการประมวลผลเซลล์เดียว (เช่น "+" ตัวอย่าง) ลงในกระบวนการดำเนินการเดียว , ตัวอย่างเช่น. วิธีการบันทึก () จะบังคับให้ดำเนินการประมวลผลเชิงภาพ
Curtis ราคา

3
@om_henners in_memory รองรับ rasters ใน ArcGIS 10.1!
Curtis ราคา

2
@om_henners arcpy มีเครื่องมือในการสร้างชื่อรอยขีดข่วนซึ่งมีข้อได้เปรียบในตัวอย่างเช่นคลาสคุณลักษณะเริ่มต้นในโฟลเดอร์จะมีการเพิ่ม ".shp" ลงในนั้นโดยอัตโนมัติ วิธีการคือ arcpy.CreateScratchName ()
Curtis ราคา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.