1 votos

¿Existe un límite de tamaño de archivo para leer BGF con Fiona?

Tengo código python que actualmente funciona bien con un GDB cuyo tamaño es de unos ~ 82,7MB. Sin embargo, cuando trato de utilizar el mismo código contra un GDB cuyo tamaño ~ 612.8MB el código parece colgarse eventualmente llevando a que el script termine.

Concretamente el código donde se produce el cuelgue es (primera línea):

buildingFeatures = [pt for pt in fiona.open(sourceDatabaseFile, 'r', layer=layer1)]

waterFeatures = [pol for pol in fiona.open(sourceDatabaseFile, 'r', layer=layer2)]

    for building in buildingFeatures:
        buildingShape = shape(building['geometry'])

        #if the geometry intersects the spatial index
        for id in idx.intersection(buildingShape.bounds):
            water = waterFeatures[id]

            #Check to see if current hydrographySrf feature intersection is a perennial water
            if (('ZI024_HYP' in water['properties']) and (water['properties']['ZI024_HYP'] == 1)):
                waterShapeGeometry = shape(water['geometry'])

                #Check to see if perennial water actually contains building point
                if waterShapeGeometry.contains(buildingShape):
                    discoveredBuildingsContainedInWaters.append(building['id'])

¿Hay alguna forma mejor de abrir un GDB grande con Fiona o existe algún tipo de límite de tamaño para los GDB utilizados con Fiona?

1voto

user70721 Puntos 16

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)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X