[Qgis-user] reduce number of open files in pyqgis script

Ludwig Kniprath ludwig at kni-online.de
Sun Dec 28 09:06:47 PST 2025


Hi Martin,

I just fiddled with QgsProviderRegistry and noticed, that 
"querySublayers" returns a bunch of GPKG-internal-views and -indices, 
that are processed in your script, although not containing any clippable 
vector data.

Workaround 1: Use osgeo.ogr.Open() to get a list of real 
vector-sub-layers and reduce the number of layer-creations, 
clip_layer-calls and open files

Workaround 2: Use osge.ogr to do the layer-creation and clip 
(sadly beyond my knowledge...)

"""
gpkg_path = "/home/martin/geodata/ZABAGED20251006.gpkg"

# variant with QgsProviderRegistry.instance().querySublayers(...)
gpkg_sub_layer_names = [gpkg_sub_layer_details.name() for 
gpkg_sub_layer_details in 
QgsProviderRegistry.instance().querySublayers(gpkg_path)]
print(len(gpkg_sub_layer_names))
print(gpkg_sub_layer_names)

# variant with osgeo.ogr.Open(...)
from osgeo import ogr
gpkg_real_sub_layer_names = [gpkg_sub_layer.GetName() for gpkg_sub_layer 
in ogr.Open(gpkg_path)]

print(len(gpkg_real_sub_layer_names))
print(gpkg_real_sub_layer_names)
"""

hth

Ludwig

Am 26.12.25 um 12:24 schrieb Martin Landa via QGIS-User:
> Dear all,
>
> I have a standalone pyqgis script which processes multiple layers 
> stored in a single GPKG. The first part of the script loops over 
> layers, performs clipping by extent and stores the result in a 
> memory layer.  The problem which I am facing is the increasing number 
> of open files which easily reach the OS limit. The sample script:
>
> """
> import sys
> import psutil, os
> import gc
>
> from qgis.core import QgsProviderRegistry, QgsVectorLayer, 
> QgsRectangle, QgsFeatureRequest, QgsWkbTypes, QgsFeature, QgsGeometry
>
> def open_files_count():
>     return len(process.open_files())
>
> def clip_layer(layer: QgsVectorLayer, extent: QgsRectangle, 
> layer_name: str) -> QgsVectorLayer:
>     extent_geom = QgsGeometry.fromRect(extent)
>     clipped_layer = QgsVectorLayer(
> f"{QgsWkbTypes.displayString(layer.wkbType())}?crs={layer.crs().authid()}",
>         layer_name,
>         "memory"
>     )
>
>     clipped_layer.dataProvider().addAttributes(layer.fields())
>     clipped_layer.updateFields()
>
>     for feature in 
> layer.getFeatures(QgsFeatureRequest().setFilterRect(extent)):
>         geom = feature.geometry()
>         if geom.intersects(extent_geom):
>             clipped_feature = QgsFeature()
> clipped_feature.setGeometry(geom.intersection(extent_geom))
> clipped_feature.setAttributes(feature.attributes())
> clipped_layer.dataProvider().addFeature(clipped_feature)
>             clipped_feature = None
>
>     clipped_layer.commitChanges()
>
>     return clipped_layer
>
> process = psutil.Process(os.getpid())
>
> gpkg_path = "/home/martin/geodata/ZABAGED20251006.gpkg"
>
> layers = QgsProviderRegistry.instance().querySublayers(gpkg_path)
>
> extent = QgsRectangle(-653547, -1065864, -653225, -1065600)
> clipped_layers = []
> for sublayer in layers:
>     name = sublayer.name <http://sublayer.name>()
>     layer = QgsVectorLayer(sublayer.uri(), 'ogr')
>
>     clipped_layer = clip_layer(layer, extent, layer.name 
> <http://layer.name>())
>
>     del layer
>
>     print(name, open_files_count())
>     if clipped_layer.featureCount() == 0:
>         del clipped_layer
>         continue
>     clipped_layers.append(clipped_layer)
> """
>
> When launching the script number of open file is increasing regardless 
> any attempts to release data sources (del layer, layer = None, 
> gc.collect(), ...):
>
> ZeleznicniStaniceZastavka 3
> ZeleznicniPrejezd_b 4
> ZdrojPodzemnichVod 5
> ...
> BazinaMocal 172
> ArealZeleznicniStaniceZastavky 173
> ArealUceloveZastavby 174
>
> Please how to release data sources correctly to avoid increasing the 
> number of open files?
>
> Thanks in advance, Martin
>
> -- 
> Martin Landa
> https://geomatics.fsv.cvut.cz/en/employees/martin-landa/
> https://gismentors.cz/mentors/landa
>
> _______________________________________________
> QGIS-User mailing list
> QGIS-User at lists.osgeo.org
> List info:https://lists.osgeo.org/mailman/listinfo/qgis-user
> Unsubscribe:https://lists.osgeo.org/mailman/listinfo/qgis-user
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-user/attachments/20251228/84f59961/attachment-0001.htm>


More information about the QGIS-User mailing list