<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Hi Martin,</p>
<p>I just fiddled with QgsProviderRegistry and noticed, that "querySublayers"
returns a bunch of GPKG-internal-views and -indices, that are <span
class="HwtZe" lang="en"><span class="jCAhz ChMk0b"><span
class="ryNqvb">processed</span></span></span> in your
script, although not containing any clippable vector data.</p>
<p>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</p>
<p>Workaround 2: Use osge.ogr to do the layer-creation and clip
(sadly beyond my knowledge...)</p>
"""<br>
gpkg_path = "/home/martin/geodata/ZABAGED20251006.gpkg"<br>
<br>
# variant with QgsProviderRegistry.instance().querySublayers(...)<br>
gpkg_sub_layer_names = [gpkg_sub_layer_details.name() for
gpkg_sub_layer_details in
QgsProviderRegistry.instance().querySublayers(gpkg_path)]<br>
print(len(gpkg_sub_layer_names))<br>
print(gpkg_sub_layer_names)<br>
<br>
# variant with osgeo.ogr.Open(...)<br>
from osgeo import ogr<br>
gpkg_real_sub_layer_names = [gpkg_sub_layer.GetName() for
gpkg_sub_layer in ogr.Open(gpkg_path)]<br>
<br>
print(len(gpkg_real_sub_layer_names))<br>
print(gpkg_real_sub_layer_names)<br>
"""
<p>hth</p>
<p>Ludwig</p>
<div class="moz-cite-prefix">Am 26.12.25 um 12:24 schrieb Martin
Landa via QGIS-User:<br>
</div>
<blockquote type="cite"
cite="mid:CA+Ei1OefMZFAYm8BOV2YDMVEKB49uQ_wu4JiUonL57E8P+YVGA@mail.gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<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"
moz-do-not-send="true">sublayer.name</a>()<br>
layer = QgsVectorLayer(sublayer.uri(), 'ogr')<br>
<br>
clipped_layer = clip_layer(layer, extent, <a
href="http://layer.name" moz-do-not-send="true">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" moz-do-not-send="true"
class="moz-txt-link-freetext">https://geomatics.fsv.cvut.cz/en/employees/martin-landa/</a><br>
<a href="https://gismentors.cz/mentors/landa"
target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">https://gismentors.cz/mentors/landa</a></div>
</div>
</div>
</div>
<br>
<fieldset class="moz-mime-attachment-header"></fieldset>
<pre wrap="" class="moz-quote-pre">_______________________________________________
QGIS-User mailing list
<a class="moz-txt-link-abbreviated" href="mailto:QGIS-User@lists.osgeo.org">QGIS-User@lists.osgeo.org</a>
List info: <a class="moz-txt-link-freetext" href="https://lists.osgeo.org/mailman/listinfo/qgis-user">https://lists.osgeo.org/mailman/listinfo/qgis-user</a>
Unsubscribe: <a class="moz-txt-link-freetext" href="https://lists.osgeo.org/mailman/listinfo/qgis-user">https://lists.osgeo.org/mailman/listinfo/qgis-user</a>
</pre>
</blockquote>
</body>
</html>