Cú pháp và cách sử dụng phù hợp cho không gian làm việc của ArcGIS trong in_memory là gì?


33

Tôi không rõ làm thế nào tốt nhất để sử dụng in_memorykhông gian làm việc trong ArcGIS. Tài nguyên tốt nhất tôi tìm thấy về chủ đề này là từ ESRI về Sử dụng không gian làm việc trong bộ nhớ . Thật không may, phần trợ giúp không có nhiều thông tin. Ngoài ra, có một bài đăng trên trang web này chạm nhanh vào chủ đề ở đâyđây .

Câu hỏi cụ thể của tôi:

  • Cách sử dụng và cú pháp thích hợp để sử dụng in_memorykhông gian làm việc trong các tập lệnh dựa trên ArcGIS / arcpy là gì?
  • in_memorykhông gian làm việc giống như, ví dụ, tạo một lớp bằng cách sử dụng arcpy.MakeFeatureLayer_management()?
  • Có bất kỳ tiêu chuẩn như xóa in_memorykhông gian làm việc ở cuối tập lệnh không?

Câu trả lời:


41

Gần đây tôi đã sử dụng "in_memory". Nó có thể rất hữu ích, vì nó có khả năng tăng đáng kể tốc độ xử lý cho một số tác vụ nhất định, tuy nhiên nếu bạn đang làm việc với các bộ dữ liệu rất lớn, nó có thể khiến chương trình của bạn bị sập.

Bạn có thể sử dụng "in_memory" để xác định đầu ra quy trình ... thường xuyên, nếu tôi đang thực hiện một tác vụ trên lớp tính năng, trước tiên tôi sẽ sao chép nó vào không gian làm việc "in_memory":

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

Lưu ý rằng bạn không phải ghép nối bộ nhớFeature như tôi đã làm, bạn có thể viết nó thành "in_memory \ myMemoryFeature", tôi chỉ thích làm theo cách đó để chuyển đổi qua lại giữa "in_memory" và một thư mục vật lý một cách dễ dàng. Sau đó, bạn có thể thực hiện các quy trình trên tính năng của bạn trong bộ nhớ. Khi bạn đã hoàn tất, bạn có thể đảo ngược quá trình để lưu nó trở lại một thư mục.

Tôi có thể sai, nhưng tôi tin rằng nó không giống như tạo một lớp tính năng. các lớp tính năng cho phép bạn truy cập vào các phương thức lựa chọn và các hoạt động cụ thể của lớp khác. Hãy nghĩ về thư mục "in_memory" là vectơ tương đương với đối tượng raster (raster = arcpy.Raster (myRasterLocation))

Để dọn dẹp sau khi sử dụng "in_memory", chỉ cần thêm dòng mã sau:

arcpy.Delete_management("in_memory")

Mong rằng sẽ giúp.


3
Tôi đồng ý với @egdetti. Nó rất hữu ích, rất mạnh mẽ và tăng tốc đáng kể quá trình xử lý. Tuy nhiên, bạn không thực sự cần phải xóa không gian làm việc / lớp, vì nó sẽ tự dọn sạch khi bạn đóng ứng dụng. Tuy nhiên, như đã đề cập, việc chạy arcpy.Delete có thể hữu ích (đôi khi cần thiết) nếu bạn thấy mình hết RAM vì bạn có quá nhiều thứ trong không gian làm việc in_memory.
RyanDalton

12

Không có nhiều thứ cho nó. Có một thư mục ma thuật mà bạn có thể truy cập trong các công cụ xử lý địa lý và con trỏ phức tạp có tên in_memory. Bạn sẽ làm một cái gì đó như arcpy.management.CreateTable('in_memory', 'my_new_table')hoặc CreateFeatureClassđể tạo ra một chiếc bàn hoặc chiếc bàn mới. Sau đó, bạn có một bảng mới trong quy trình đó với đường dẫn in_memory\my_new_table, nếu bạn đang ở trong arcmap, nó sẽ thêm chế độ xem bảng vào bảng nội dung có tên my_new_tablemà bạn có thể sử dụng làm lối tắt để đến đó. Nếu đó là tạm thời trong bảng bộ nhớ, chỉ sử dụng arcpy.management.Delete(r'in_memory\my_new_table')khi bạn hoàn thành nó ở cuối tập lệnh của mình.


9

Hơi lạc đề, nhưng tôi nghĩ đáng để chỉ ra. Đầu tiên tôi đồng ý với cả @JasonScheirer và @egdetti ở trên in_memorycó thể rất hữu ích. Điều lớn nhất cần lưu ý là in_memorykhông gian làm việc không hỗ trợ dữ liệu raster. Nếu điều này trở thành vấn đề tôi khuyên bạn nên sử dụng tempfilemô-đun Python . Điều này sẽ không nhanh như vậy, nhưng đáng tin cậy hơn. Ví dụ: bạn có thể làm một cái gì đó như:

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 có một cách để đối phó với các raster được xây dựng bằng phương thức arcpy.Raster (). Bằng cách xác định một biến như myRaster = arcpy.Raster ("C: \ RasteLocation"), bạn tạo một đối tượng raster trong bộ nhớ có thể được sử dụng trong tính toán đại số bản đồ và các hoạt động raster khác. Lưu một đối tượng raster như vậy cũng đơn giản như viết trong myRaster.save ("C: \ SaveLocation"). Một tính năng rất hữu ích mà arcpy mang đến cho bàn.
bluefoot

@egdetti Cuộc gọi công bằng. Tôi tò mò muốn biết làm thế nào nó xử lý các bộ dữ liệu lớn hơn.
om_henners

1
@mbenedetti - đối tượng Raster ghi raster vào không gian làm việc cào xé - càng muộn càng tốt, cho phép Arcpy tối ưu hóa I / O bằng cách xếp các công cụ xử lý đơn bào (ví dụ như "+") vào một quy trình thực hiện duy nhất , ví dụ. Phương thức save () sẽ buộc thực thi xử lý raster.
Giá của Curtis

3
@om_henners in_memory hỗ trợ các trình quét trong ArcGIS 10.1!
Giá của Curtis

2
@om_henners arcpy cung cấp một công cụ để tạo tên cào, có ưu điểm trong đó là lớp tính năng cào trong thư mục tự động có ".shp" được thêm vào nó. Phương thức này là arcpy.CreateScratchName ().
Giá của Curtis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.