print "Starting function" # Define and setup variables, tables, key field etc calc_table = arcpy.MakeTableView_management(table_path) vol_tab = join_table_path strata_tab = "in_memory/temp" arcpy.MakeTableView_management(vol_tab, strata_tab) joinField = "STRATA" # Create list of value fields, leaving out OID field and key/join field flistObj = arcpy.ListFields(strata_tab) flist = [] for f in flistObj: if f.type != "OID" and f.name != joinField: flist.append(f.name) # Create empty dict object then populate each key with a sub dict by row using value fields as keys strataDict = {} for r in arcpy.SearchCursor(strata_tab): fieldvaldict = {} for field in flist: fieldvaldict[field] = r.getValue(field) strataDict[r.getValue(joinField)] = fieldvaldict del strata_tab, flistObj
rows = arcpy.UpdateCursor(calc_table, "\"%s\" IS NOT NULL" % joinField) for row in rows: strata = row.getValue(joinField) variable = strataDict[strata]["sub_key_field"]
species = [ ("C","Fb","FB_STEMS"),("C","Sw","SW_STEMS"),("C","Pj","PJ_STEMS"), # 0,1,2 ("C","Pl","PJ_STEMS"),("C","Lt","LT_STEMS"),("C","Sb","SB_STEMS"), # 3,4,5 ("D","Bw","BW_STEMS"),("D","Aw","AW_STEMS"),("D","Pb","PB_STEMS") # 6,7,8 ] sp_fields = [("SP1","SP1_PER"),("SP2","SP2_PER"),("SP3","SP3_PER"), ("SP4","SP4_PER"),("SP5","SP5_PER")] print "Beginning updates" rows = arcpy.UpdateCursor(calc_table, "\"%s\" IS NOT NULL" % joinField) for row in rows: strata = row.getValue(joinField) for sp, per in sp_fields: sp_type = row.getValue(sp) spp_f = float(row.getValue(per)) if spp_f > 0: for grp, spec, stem in species: stem_f = strataDict[strata][stem] (...)
Solved! Go to Solution.
222565 dictionary count 0:00:46.594000 222565 dictionary count 0:00:48.125000
Related to this post: http://forums.arcgis.com/threads/58348-Large-Dictionary-Compression, I am having troubles when the dictionaries get too big!
Although it's slower, especially for multiple fields, I am finding the ole' "Join and Calc" method is much more memory efficient.