编辑:我正在努力寻找最好的解决方案,虽然我只熟悉 Python,但我想做的事情不应该那么难或花那么长时间。我编辑了标题以询问使用 R 或其他程序的选项。
我正在使用 Python 2.7 的 64 位计算机上的 ArcGIS 10.1 中应对以下挑战。
我有一个包含三个字段的表:ID#、“收入”和“直播”——以及 210 万条记录。
我正在尝试通过将 fGDB 的名称与此表中的 ID# 匹配来从 fGDB 中提取要素类,将两个字段添加到 FC,并使用收入和实时数据值填充这些字段。
我的脚本包括一层又一层的 for 循环、if 语句和搜索游标。尽管它在小批量测试中工作,但它对真实数据的处理时间很长,因为它正在搜索 210 万条记录。
我在下面包含了我的脚本,它可以工作 - 并且还显示了我的逻辑流程,这是我需要指导的地方......
将很长的记录列表与一组要素类进行比较/匹配时,最佳策略是什么?
import arcpy
import sys
import os
#Read through DBF.
#For each record, locate it in fGDB and add fields REVENUE and LIVE
# Use searchCursor to find ID and REV value and LIVE value
#fc = #ID by the APR16ID
fields = ["APR16_ID","REVENUE", "LIVE"]
workspace = "C:\\FILE\\"
arcpy.env.workspace = workspace
#Table of values to append to each FC in the fGDB
table = "C:\\FILE\\FinalTest.gdb\\AUG_REV_BY_APRID"
#DIRECTORYPATH = the fGDB that has the FeatureClasses that are to have data appended to them.
directorypath = workspace + "DON_d2.gdb"
#Use searchcursor to determine APR16_ID...
cursor = arcpy.da.SearchCursor(table, fields)
for row in cursor:
fc = str("don_d2_"+"{0}".format(row[0]))
print fc
RevVAL = str(row[1])
print RevVAL
LiveVAL = str(row[2])
print LiveVAL
for dirpath, dirnames, fgdb in arcpy.da.Walk(directorypath,
datatype="FeatureClass",
type="Polygon"):
for donut in fgdb:
if str(donut)==str(fc):
print donut + " : this is the same as " + fc
##Append data to donuts_d2
d2_fc = workspace+"DON_d2.gdb\\"+fc
arcpy.AddField_management(d2_fc, "REVENUE", "FLOAT")
arcpy.AddField_management(d2_fc, "LIVE", "FLOAT")
arcpy.GetMessages()
#new SearchCursor for that feature
dons = arcpy.UpdateCursor(d2_fc, fields)
for don in dons:
don.setValue("REVENUE",RevVAL)
don.setValue("LIVE",LiveVAL)
dons.updateRow(don)
arcpy.GetMessages()
else:
pass