<!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>