Así que reescribí parte de mi código para excluir propiedades que no me interesaba almacenar para minimizar mi huella de memoria. Además, cerré los flujos de archivos por si acaso.
for bldg in buildingLayerList:
with fiona.open(sourceDatabaseFile, 'r', layer=bldg) as sourceFile1:
for building in sourceFile1:
buildingFeatures.append((building['id'], building['geometry']))
sourceFile1.close()
#Use current list of buildings and compare against all hydrography layers
for hydro in hydrographyLayerList:
with fiona.open(sourceDatabaseFile, 'r', layer=hydro) as sourceFile2:
for water in sourceFile2:
waterFeatures.append((water['id'], water['geometry'], water['properties']))
sourceFile2.close()
#from rtree import index
idx = index.Index() #Create an R-Tree index and store the features in it (bounding box)
for pos, poly in enumerate(waterFeatures):
idx.insert(pos, shape(poly[1]).bounds)
for building in buildingFeatures:
buildingShape = shape(building[1])
#if the geometry intersects the spatial index
for id in idx.intersection(buildingShape.bounds):
water = waterFeatures[id]
#Check to see if current hydrography feature intersection is a perennial water
if (('ZI024_HYP' in water[2]) and (water[2]['ZI024_HYP'] == 1)):
waterShapeGeometry = shape(water[1])
numBoundedBldgHydroFeaturesEvaluated += 1
#Check to see if perennial water actually contains building feature
if waterShapeGeometry.contains(buildingShape):
discoveredBuildingsContainedInWaters.append(building[0])
if len(discoveredBuildingsContainedInWaters) > 0:
totalBldgIDs.update({bldg + " vs " + hydro: sorted(discoveredBuildingsContainedInWaters)})
discoveredBuildingsContainedInWaters[:] = [] # Just in case
waterFeatures[:] = [] # Just in case
buildingFeatures[:] = [] # Just in case
El resultado final fue que llegué mucho más lejos de análisis a través de la GDB, pero el código finalmente terminó por las mismas razones Vince declaró anteriormente antes.
Me puse en contacto con el administrador del servidor en el que estaba ejecutando mi script y descubrí que el entorno en el que estaba funcionando tenía 16 GB de RAM compartidos entre todos los usuarios que iniciaban sesión simultáneamente (normalmente al menos 6 usuarios). También resultó que el entorno no estaba configurado con un archivo de intercambio, por lo que era puramente RAM. El administrador añadió un archivo swap de 8GB y esto solucionó mis problemas.
Para caracterizar mi problema, el GDB que estaba utilizando tenía el siguiente recuento de características de las capas de construcción frente a las de hidrografía:
StructurePnt - 1.533.842 funciones
StructureCrv - 476 características
HidrografíaSrf - 7.729 características
HidrografíaCrv - 60.090 características
El peor escenario posible fue 92.168.565.780 permutaciones (StructurePnt vs HydrographyCrv)