Eu escrevi esse script que se repete em todas as classes de recursos em um determinado conjunto de conjuntos de dados de recursos e exclui todos os seus recursos. Parece fazer o trabalho, mas corre bem devagar. Existe algo que estou fazendo errado aqui ou existem maneiras óbvias de acelerar as coisas?
Estou usando DeleteFeatures_management para executar a ação. DeleteRows_management também parece funcionar.
import sys
import os
import arcpy
from arcpy import env
import datetime
import getpass
try:
passwd = getpass.getpass("Enter the sde user password: ")
sdeConnectionFileDir = os.environ.get("TEMP")
databaseName = ""
fileName = "temp.sde"
# Delete any pre-existing SDE connection file.
fullPath = sdeConnectionFileDir + '\\' + fileName
if os.path.exists(fullPath):
os.remove(fullPath)
# Create temporary SDE connection file.
arcpy.CreateArcSDEConnectionFile_management (
sdeConnectionFileDir, fileName,
"sdeserver", "5151", "",
"DATABASE_AUTH", "my_sde_user", passwd,
"SAVE_USERNAME", "SDE.DEFAULT", "SAVE_VERSION"
)
env.workspace = fullPath
# ArcPy status codes.
returnCodes = {'WARN' : 0, 'INFO' : 1, 'ERROR' : 2}
featureDatasets = []
featureDatasets.extend(arcpy.ListDatasets("dataset1*"))
featureDatasets.extend(arcpy.ListDatasets("dataset2*"))
featureDatasets.extend(arcpy.ListDatasets("dataset3*"))
list = '[%s]' % ', '.join(map(str, featureDatasets))
response = raw_input("\n***** WARNING!!! ***** \nAll data will be deleted from all feature classess in the following datasets: \n\n" + list + "\n\n |--> Type DELETE to begin removal: ")
if response == "DELETE":
print "\nStarted: " + str(datetime.datetime.now()) + "\n"
for dataset in featureDatasets:
print "Processing dataset: " + dataset
for fc in arcpy.ListFeatureClasses("*", "ALL", dataset):
rowCount = int(arcpy.GetCount_management(fc).getOutput(0))
if rowCount > 0:
print " -- Processing feature class: " + str(fc) + " (" + str(rowCount) + " rows)"
#arcpy.DeleteRows_management(fc)
arcpy.DeleteFeatures_management(fc)
print "\nCompleted: " + str(datetime.datetime.now())
except Exception as e:
if arcpy:
arcpyErrors = arcpy.gp.getMessages(returnCodes['ERROR'])
if arcpyErrors:
sys.stderr.write(arcpyErrors + "\n")
sys.stderr.write(str(e) + "\n")
sys.exit(1)
EDIT -
Coloquei alguns temporizadores de desempenho no script e aqui estão os dados:
- Hora de recuperar conjuntos de dados: 0: 00: 01.254000
- Total de classes de recurso: 1682
- Total de classes de recursos com dados: 124
- Total de recursos processados: 190222
- Tempo total de execução : 3 horas, 16 minutos
O colapso:
Conjunto de dados de recursos -> listar chamadas de classe de recursos:
* AVG 0:00:02
* MIN 0:00:01
* MAX 0:00:07
* COUNT 40
* TOTAL 0:01:08
Chamadas de contagem de recursos (na maioria das vezes):
* AVG 0:00:06
* MIN 0:00:01
* MAX 0:00:16
* COUNT 1682
* TOTAL 2:41:00
Chamadas de exclusão de recurso (reduzidas porque apenas as classes de recurso com linhas são processadas):
* AVG 0:00:17
* MIN 0:00:02
* MAX 0:03:22
* COUNT 124
* TOTAL 0:34:31
fonte
Se a atualização para o ArcGIS 10.1 (agora lançada) for uma opção, então eu a encontrei no PDF What's New in ArcGIS 10.1:
Sua ajuda on-line pode ser encontrada aqui .
fonte
Por que não excluir apenas os conjuntos de dados de recursos
arcpy.DeleteFeatures_management(dataset)
? Se você ainda precisa que o conjunto de dados do recurso exista, basta recriá-lo depois que ele for excluído.fonte