Skip to content

Commit f8cbc42

Browse files
authored
Merge pull request #5594 from nyalldawson/batch_lazy
[processing] Fix issues with batch processing and large count of layers
2 parents 6de3980 + 2ed2248 commit f8cbc42

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

python/plugins/processing/gui/BatchAlgorithmDialog.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ def accept(self):
8080
load = []
8181

8282
feedback = self.createFeedback()
83-
context = dataobjects.createContext(feedback)
83+
84+
load_layers = self.mainWidget.checkLoadLayersOnCompletion.isChecked()
85+
project = QgsProject.instance() if load_layers else None
8486

8587
for row in range(self.mainWidget.tblParameters.rowCount()):
8688
col = 0
@@ -90,7 +92,7 @@ def accept(self):
9092
continue
9193
wrapper = self.mainWidget.wrappers[row][col]
9294
parameters[param.name()] = wrapper.value()
93-
if not param.checkValueIsAcceptable(wrapper.value(), context):
95+
if not param.checkValueIsAcceptable(wrapper.value()):
9496
self.bar.pushMessage("", self.tr('Wrong or missing parameter value: {0} (row {1})').format(
9597
param.description(), row + 1),
9698
level=QgsMessageBar.WARNING, duration=5)
@@ -104,11 +106,11 @@ def accept(self):
104106
count_visible_outputs += 1
105107
widget = self.mainWidget.tblParameters.cellWidget(row, col)
106108
text = widget.getValue()
107-
if out.checkValueIsAcceptable(text, context):
109+
if out.checkValueIsAcceptable(text):
108110
if isinstance(out, (QgsProcessingParameterRasterDestination,
109111
QgsProcessingParameterFeatureSink)):
110112
# load rasters and sinks on completion
111-
parameters[out.name()] = QgsProcessingOutputLayerDefinition(text, context.project())
113+
parameters[out.name()] = QgsProcessingOutputLayerDefinition(text, project)
112114
else:
113115
parameters[out.name()] = text
114116
col += 1
@@ -145,6 +147,12 @@ def accept(self):
145147
feedback.pushCommandInfo(pformat(parameters))
146148
feedback.pushInfo('')
147149

150+
# important - we create a new context for each iteration
151+
# this avoids holding onto resources and layers from earlier iterations,
152+
# and allows batch processing of many more items then is possible
153+
# if we hold on to these layers
154+
context = dataobjects.createContext(feedback)
155+
148156
alg_start_time = time.time()
149157
ret, results = execute(self.alg, parameters, context, feedback)
150158
if ret:
@@ -159,9 +167,9 @@ def accept(self):
159167
else:
160168
break
161169

162-
feedback.pushInfo(self.tr('Batch execution completed in {0:0.2f} seconds'.format(time.time() - start_time)))
170+
handleAlgorithmResults(self.alg, context, feedback, False)
163171

164-
handleAlgorithmResults(self.alg, context, feedback, False)
172+
feedback.pushInfo(self.tr('Batch execution completed in {0:0.2f} seconds'.format(time.time() - start_time)))
165173

166174
self.finish(algorithm_results)
167175
self.buttonCancel.setEnabled(False)

python/plugins/processing/ui/widgetBatchPanel.ui

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,13 @@
120120
</property>
121121
</widget>
122122
</item>
123+
<item row="2" column="0" colspan="6">
124+
<widget class="QCheckBox" name="checkLoadLayersOnCompletion">
125+
<property name="text">
126+
<string>Load layers on completion</string>
127+
</property>
128+
</widget>
129+
</item>
123130
</layout>
124131
</widget>
125132
<resources/>

0 commit comments

Comments
 (0)