Tăng tốc độ của các tập lệnh Python bằng arcpy


8

Cập nhật ngày 4/11/2014

Có vẻ như tập lệnh đã bị treo lên trên công cụ Xóa Tính năng, vì vậy tôi đã chuyển sang Bảng cắt bớt, như được đề xuất trong câu trả lời dưới đây. Tôi cũng loại bỏ các biến không sử dụng khỏi công cụ chắp thêm.

Cập nhật ngày 4/10/2014

Tôi đã chạy tập lệnh này trên máy tính của đồng nghiệp (máy của anh ta có nhiều bộ nhớ hơn và chứa ArcGIS 10.0 / Python26) và nó chạy rất nhanh. Hoan hô! Khi bộ phận hỗ trợ kỹ thuật của tôi tìm thấy CD ArcGIS 10.0, tôi sẽ cài đặt và kiểm tra xem điều đó có cải thiện tốc độ trên máy của tôi không. Để rõ ràng, chúng tôi đang chạy cùng một tập lệnh, ổ đĩa mạng và kết nối cơ sở dữ liệu của chúng tôi được ánh xạ giống hệt nhau và các câu lệnh in giống nhau. Tôi sẽ đăng một bản cập nhật ở đây một khi điều đó xảy ra.

Kết thúc cập nhật

Tôi cần tăng tốc độ của một số tập lệnh Python thực hiện cập nhật trên cơ sở dữ liệu Oracle. Tôi đã có các tập lệnh Python này chạy tốt trong một năm +, thông qua các tác vụ theo lịch trình và các tệp bó để khởi tạo các tập lệnh. Tuần trước tôi đã chuyển từ XP sang máy Windows 7 và ArcGIS 10.0 -> 10.1. Kể từ đó các kịch bản đã trở nên chậm khủng khiếp. Nếu tôi chạy tập lệnh này bằng một lớp tính năng nhỏ (chứa ~ 20 tính năng) thì nó sẽ chạy trong 30 giây. Nếu tôi sử dụng một lớp tính năng trung bình (~ 80.000 bản ghi) thì nó sẽ chạy trong 15 phút. Lớp tính năng tôi thực sự cần để có thể chuyển nhanh chóng chứa khoảng 1.000.000 bản ghi - tập lệnh chỉ đi xa đến câu lệnh in để kiểm tra xem các tệp có tồn tại không (nếu câu lệnh trong mã bên dưới). Quá trình này sẽ chỉ mất 35 phút để hoàn thành trên máy XP / ArcGIS 10.0 của tôi.

Dưới đây là mã đơn giản hóa mà tôi đã thử nghiệm. Có ai có đề xuất về những gì tôi có thể làm để tăng tốc độ không? Cảm ơn, Patty

import arcpy, os, sys
from arcpy import env
arcpy.env.overwriteOutput = True
from datetime import datetime
import smtplib
import string
import urllib

#Define variables
inWorkspace = "O:/LANDING_PAD/BOE/example.gdb" 
lpFeatures = inWorkspace + os.sep + "fc1"
outWorkspace =  "Database Connections\\THIS.sde"
arcpy.env.workspace = outWorkspace
workspace = ""
copyFC = outWorkspace + os.sep + "SDE.fc1_1" #The feature class the script will update via delete and append
schema_type = "NO_TEST"
fieldMappings = ""
subtype = ""
t = datetime.now()
print "This script began at: " + str(t)

if arcpy.Exists(lpFeatures) is True and arcpy.Exists(copyFC) is True:
    print "Both files exist. Beginning delete..."
    arcpy.DeleteFeatures_management(copyFC) #(copyFC)

    print "ALL DONE DELETING!"

    arcpy.Append_management(lpFeatures, copyFC, schema_type, fieldMappings, subtype) #Append data from landing pad to db
    print "ALL DONE APPENDING!"
    record_count = arcpy.GetCount_management(lpFeatures)
    print record_count
    r = datetime.now()
    print "This script ended at: " + str(r)

1
Tôi chưa sử dụng Arcpy, nhưng tôi đã viết một số Python và rất nhiều hệ thống song song trong C #. Có thể bạn có thể chia công việc của bạn thành nhiều phần nhỏ hơn và làm việc song song với chúng không? Hoặc gửi nhiều quá trình Python hoặc cố gắng sử dụng luồng. Nó có thể trở nên lộn xộn, đặc biệt là nếu arcpy không an toàn cho luồng, nhưng nó có thể được đền đáp khi bạn có nhiều việc phải làm! Nó cũng có thể giúp hỏi về Stack Overflow.
vui vẻ

Sự chậm chạp là do bạn đang xóa tất cả các tính năng riêng lẻ và nối thêm vào lớp tính năng trống. Có bất kỳ lý do nào bạn không thể xóa toàn bộ lớp tính năng Delete_management()và sau đó tạo lại nó bằng CopyFeatures_management()hoặc FeatureClassToFeatureClass_conversion()không?
nmpeterson

2
Bạn đã thực hiện bất kỳ hồ sơ nào ( docs.python.org/2/l Library / profile.html ) để xác định nơi xảy ra hàng loạt quá trình xử lý của bạn chưa? Sẽ rất thú vị khi xem kết quả của bạn.
Aaron

1
@jocull vâng, tôi đã nghĩ đến việc kết hợp một cái gì đó sử dụng đa xử lý, nhưng tôi hơi bế tắc về cách các tập lệnh quá nhanh trên XP / ArcGIS 10.0 của tôi và chậm trên Windows 7 / 10.1. Aaron, vâng, thật tuyệt khi thấy quá trình xử lý đang diễn ra tôi sẽ xem xét hồ sơ kịch bản. Cảm ơn, patty
Patty Jula

Tôi đã đăng một bản cập nhật ở trên. Về cơ bản, các kịch bản chạy nhanh trên máy của đồng nghiệp của tôi là tốt.
Patty Jula

Câu trả lời:


7

Tôi đã muốn bình luận đầu tiên, nhưng sau đó có vẻ phù hợp hơn để bọc nó thành một câu trả lời (mặc dù nó có thể không đầy đủ).

Tôi đã chạy mã của bạn trên máy của tôi (máy tính xách tay phần cứng hàng đầu có SSD) nối thêm lớp tính năng cơ sở dữ liệu địa lý tệp vào lớp tính năng cơ sở dữ liệu địa lý SQL Server trên cùng một máy mà tôi mất khoảng 13 phút. Tôi không thể cho bạn biết chắc chắn tại sao tốc độ thực hiện lại khác nhau rất nhiều trong môi trường của bạn (10.0 >> 10.1), nhưng bạn đã yêu cầu đề xuất về những gì bạn có thể làm để tăng tốc độ , vì vậy đây là một số ý tưởng có thể tăng tốc độ chạy tập lệnh.

1) Tôi chạy tập lệnh từ dòng lệnh tương đương với việc chạy tệp .bat (Tôi chạy tập lệnh theo hương vị 64 bit, tôi đã cài đặt Python ArcGISx6410.2 64 bit).

c:\Python27\ArcGISx6410.2\python.exe c:\scripts\appendfc.py

Theo kinh nghiệm của tôi, việc chạy phiên bản Python 64 bit để chạy các hoạt động GP dài và nặng như Append là nhanh hơn. Vì vậy, bạn muốn chắc chắn rằng bạn chạy phiên bản Python này khi thực thi tập lệnh.

2) Tôi không khuyên bạn nên sử dụng arcpy.DeleteFeatures_management; nó chậm hơn nhiều so với chạy Truncate Table vì cái sau không sử dụng các giao dịch cơ sở dữ liệu giúp cải thiện hiệu suất trong việc xóa từng hàng.

Bạn đã đề cập rằng tập lệnh chỉ đi xa đến câu lệnh in để kiểm tra xem các tập tin có tồn tại không (nếu câu lệnh trong mã) . Có một cơ hội tốt là nó tiếp tục xóa từng hàng có thể là một quá trình rất chậm khi bạn truy cập một bảng trong cơ sở dữ liệu Oracle (hoặc thực sự là bất kỳ DBMS) nào. Hãy thử chạy tập lệnh với Bảng rút gọn, nhưng không có phần bổ sung đầu tiên chỉ để thấy sự khác biệt về hiệu suất trên giai đoạn xóa.

3) Bạn dường như đang sử dụng "Database Connections\\THIS.sde"mã. Tuy nhiên, tốt hơn là tham khảo chính tệp kết nối (tệp .sde) với hệ thống tệp hoặc đường dẫn UNC, chứ không phải thư mục "Kết nối cơ sở dữ liệu" của cửa sổ. Bạn có thể truy cập tệp .sde được tạo tại C:\Users\%user%\AppData\Roaming\ESRI\Desktop10.1\ArcCatalog. Bạn có thể di chuyển tệp .sde này xung quanh khi bạn cần và đặt vào thư mục tập lệnh Python sẽ có quyền truy cập.

4) Trong arcpy.Append_managementhàm, bạn sử dụng một vài tham số trống. Về lý thuyết, nó không tạo ra bất kỳ sự khác biệt nào, nhưng tôi khuyên bạn nên chạy hàm mà không chỉ định các tham số đó chỉ vì bạn không cần chúng. Bạn không bao giờ biết những gì đang diễn ra đằng sau hậu trường và liệu những chuỗi trống đó có được đánh giá tại một số điểm hay không và liệu điều này có thể ảnh hưởng đến hiệu suất. Chỉ cần đi cùng arcpy.Append_management(lpFeatures, copyFC, schema_type)và không chỉ định tham số mà bạn không cung cấp bất kỳ giá trị nào.

5) Tôi không khuyến khích sử dụng os.sepkhi xây dựng đường dẫn đến lớp đối tượng. Sử dụng os.path.join(geodatabase,featureclassname)cho điều đó thay vào đó. Nó chỉ là sạch hơn và dễ đọc hơn.

Bạn có thể thêm chi tiết cho câu hỏi sau khi bạn đã thử những điều trên và có một số bài kiểm tra và đánh giá mã.

Một vài câu hỏi hay để đọc để hiểu rõ hơn về cách tăng tốc các tập lệnh Python trong ArcGIS:

Hiệu suất của ArcGISScripting và các bộ dữ liệu không gian lớn

Xử lý địa lý nền (64-bit)

Công cụ Arcgis CopyFeatures cực kỳ chậm khi xuất sang SDE

Các cách để tăng tốc tập lệnh Python chạy dưới dạng công cụ ArcGIS

Xem xét xử lý địa lý cho dữ liệu ArcSDE


Cảm ơn rất nhiều, bạn đã lưu thứ sáu của tôi. Tôi muốn thêm rằng có, tôi có thể gọi một cơ sở dữ liệu trong một tệp bó được đặt tên "Database Connections\\THIS.sde". Có lẽ điều này là do tệp bó chỉ khởi tạo các tập lệnh Python sử dụng biến này? Tôi không thể có một cơ sở dữ liệu có tên THIS database.sdelạ đối với tôi vì có một không gian trong đó Database Connections. Cảm ơn một lần nữa,
Patty Jula

Vui vì nó hữu ích. 1. Làm thế nào để nó trông hiệu suất khôn ngoan bây giờ? 2. Thú vị với "Kết nối cơ sở dữ liệu". Tôi chắc chắn rằng bạn không thể tham khảo "thư mục" này trong cửa sổ Danh mục khi không chạy tập lệnh từ GUI GUI của ArcGIS, nhưng tôi đã nhầm. Tôi đã cập nhật câu trả lời của mình để phản ánh điều này. 3. Bạn có thể có tệp kết nối "this database.sde", khoảng trắng được sử dụng. Nhưng bạn không thể có cơ sở dữ liệu trong Oracle với không gian với cách thức hoạt động của DBMS.
Alex Tereshenkov

Hiệu suất được cải thiện ngay bây giờ. Quá trình chạy lớp tính năng triệu bản ghi (của các điểm địa chỉ) chạy trên máy Windows 7 / ArcGIS 10.1 ngay bây giờ (trước khi nó đóng băng trên công cụ tính năng xóa). Phải mất 3 giờ để chạy toàn bộ quá trình này. Quá trình này mất 50 phút trên máy XP / 10.0 của tôi. Đây có phải là liên kết mà bạn đang đề cập đến với điểm 1 trong câu trả lời của bạn không?
Patty Jula

@PattyJula, phải, nó là cái này. Bạn không cần phải cài đặt / sử dụng phần mềm xử lý nền được cài đặt trên đầu. Bạn chỉ cần sử dụng hương vị 64 bit của Python khi chạy tập lệnh của mình.
Alex Tereshenkov

Cám ơn vì sự gợi ý. Tôi đã cài đặt Python 64 bit cộng với máy khách Oracle 64 bit. Các tập lệnh của tôi vẫn không chạy ở tốc độ chúng chạy với cấu hình XP / ArcGIS 10.0 của tôi. Tôi sẽ lên lịch tác vụ để chạy các tệp bó và tập lệnh Python vào tối nay, nếu tốc độ không được cải thiện, tôi có thể cần phải thiết lập một máy khác chạy ArcGIS 10.0.
Patty Jula

1

Tôi hy vọng ví dụ này cũng sẽ giúp trả lời câu hỏi và trên phần mềm mới hơn. Nó được xây dựng trên các câu trả lời và ý kiến ​​được đề cập ở trên.

Thiết lập:

  1. Windows 7
  2. Máy chủ SQL 2012 R2
  3. ArcGIS 10.2.2 (Máy chủ và máy tính để bàn)

Tải cần thiết để được hàng đêm. Đó là ~ 9300 hồ sơ và 234 thuộc tính.

Mô hình ban đầu nằm bên dưới và được thực hiện tất cả trong SQL Server 2012 R2 / SDE (7 phút qua ArcCatalog & 3 giờ với python):

  1. Xóa hàng của lớp tính năng trong SDE
  2. Tạo lớp sự kiện XY từ bảng trong SQL Server
  3. Nối vào lớp tính năng trong SDE

Tôi đã thay đổi nó như thế nào (10 giây qua ArcCatalog & 10 giây qua python): •

  1. Công cụ xóa hàng thay thế bằng công cụ Cắt bớt cho lớp Tính năng GIS trong SDE
  2. Xuất bảng SQL sang FGDB trên ổ C cục bộ
  3. Tạo lớp sự kiện XY trên bộ nhớ cục bộ
  4. Lớp tính năng đến Lớp tính năng trong FGDB trên ổ đĩa C cục bộ
  5. THEN Nối lớp tính năng FGDB vào SDE
  6. Lưu ý rằng cơ sở dữ liệu SQL Server của tôi nằm trên cùng ổ C với FGDB của tôi. Nó có thể chậm lại một chút qua mạng nhưng rất có thể không phải là 3 giờ tôi đã thấy.

Điều đã giúp một chút trên mô hình ban đầu là thay thế các nguồn dữ liệu theo # 3 được đề xuất ở trên. Nó cạo đi 30 giây khi chạy trong ArcCatalog. Với con trăn nó cạo đi khoảng 20 phút. Do đó, nó là một biến về tốc độ nhưng nó không phải là biến có giá trị nhất để giải quyết trong trường hợp của tôi. Nó xuất hiện theo hầu hết các blog SQL Server chỉ không thích tải dữ liệu nặng từ bộ nhớ xóa (tức là tạo lớp sự kiện xy). SQL / SDE dường như thích một đối tượng thực tế để tải. Điều này giải thích tại sao các tải khác của tôi tôi làm theo cách tương tự mất 1 phút, nhưng đó chỉ là 1000 bản ghi với 15 thuộc tính nên tôi không bao giờ đặt câu hỏi về hiệu quả của các mô hình của mình cho đến khi tải này cần được thực hiện hàng đêm. Như đã đề cập, tải này là 9000 bản ghi với 236 thuộc tính.


0

Vấn đề với hiệu suất giữa 10.0 và 10.1 là một cái gì đó trong các thư viện SDE đã bị thay đổi trong máy tính để bàn. Chúng tôi thường đăng 1.000.000 mỗi đêm và chỉ mất 45 phút, sau khi cập nhật phần mềm mất gần 24 giờ. Rõ ràng là không có vấn đề với dữ liệu và chỉ có phần mềm được thay đổi.

Kiểm tra phiên bản của cơ sở dữ liệu địa lý để đảm bảo nó phù hợp với phiên bản của máy khách đang chạy arcpy. Chúng tôi đã báo cáo điều này với ESRI mà không có phản hồi hoặc nhận ra lỗi. Đó là khá rõ ràng và vấn đề bắt đầu sau 10.0 SP1.

Ngoài ra, một thử nghiệm khác, một bản sao / dán nhanh hơn so với một bản thử thêm từ 10.0 và 10.1 và hiệu suất sẽ tương tự nhau. Điều này chứng tỏ có một số loại lỗi sẽ xảy ra với các phiên bản trước khi nối thêm hình học.

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.