<div dir="ltr"><div>Dear all,</div><div><br></div><div>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:</div><div><br></div><div>"""</div><div>import sys<br>import psutil, os<br>import gc<br><br>from qgis.core import QgsProviderRegistry, QgsVectorLayer, QgsRectangle, QgsFeatureRequest, QgsWkbTypes, QgsFeature, QgsGeometry<br><br>def open_files_count():<br>    return len(process.open_files())<br><br>def clip_layer(layer: QgsVectorLayer, extent: QgsRectangle, layer_name: str) -> QgsVectorLayer:<br>    extent_geom = QgsGeometry.fromRect(extent)<br>    clipped_layer = QgsVectorLayer(<br>        f"{QgsWkbTypes.displayString(layer.wkbType())}?crs={layer.crs().authid()}",<br>        layer_name,<br>        "memory"<br>    )<br><br>    clipped_layer.dataProvider().addAttributes(layer.fields())<br>    clipped_layer.updateFields()<br><br>    for feature in layer.getFeatures(QgsFeatureRequest().setFilterRect(extent)):<br>        geom = feature.geometry()<br>        if geom.intersects(extent_geom):<br>            clipped_feature = QgsFeature()<br>            clipped_feature.setGeometry(geom.intersection(extent_geom))<br>            clipped_feature.setAttributes(feature.attributes())<br>            clipped_layer.dataProvider().addFeature(clipped_feature)<br>            clipped_feature = None<br><br>    clipped_layer.commitChanges()<br><br>    return clipped_layer<br><br>process = psutil.Process(os.getpid())<br><br>gpkg_path = "/home/martin/geodata/ZABAGED20251006.gpkg"<br><br>layers = QgsProviderRegistry.instance().querySublayers(gpkg_path)<br><br>extent = QgsRectangle(-653547, -1065864, -653225, -1065600)<br>clipped_layers = []<br>for sublayer in layers:<br>    name = <a href="http://sublayer.name">sublayer.name</a>()<br>    layer = QgsVectorLayer(sublayer.uri(), 'ogr')<br><br>    clipped_layer = clip_layer(layer, extent, <a href="http://layer.name">layer.name</a>())<br><br>    del layer<br>    <br>    print(name, open_files_count())<br>    if clipped_layer.featureCount() == 0:<br>        del clipped_layer<br>        continue<br>    clipped_layers.append(clipped_layer)<br></div><div>"""</div><div><br></div><div>When launching the script number of open file is increasing regardless any attempts to release data sources (del layer, layer = None, gc.collect(), ...):</div><div><br></div><div>ZeleznicniStaniceZastavka 3<br>ZeleznicniPrejezd_b 4<br>ZdrojPodzemnichVod 5<br></div><div>...</div><div>BazinaMocal 172<br>ArealZeleznicniStaniceZastavky 173<br>ArealUceloveZastavby 174<br></div><div><br></div><div>Please how to release data sources correctly to avoid increasing the number of open files?</div><div><br></div><div>Thanks in advance, Martin</div><div><br></div><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Martin Landa<div><a href="https://geomatics.fsv.cvut.cz/en/employees/martin-landa/" target="_blank">https://geomatics.fsv.cvut.cz/en/employees/martin-landa/</a><br><a href="https://gismentors.cz/mentors/landa" target="_blank">https://gismentors.cz/mentors/landa</a></div></div></div></div>