Scenario: Add memory clean for Pamhyr list, dict and reaches.

disable_edition_parent_scenario
Pierre-Antoine 2026-05-21 11:16:31 +02:00
parent 2c0b155baf
commit f9d83ac68c
6 changed files with 65 additions and 7 deletions

View File

@ -103,6 +103,9 @@ class Reach(SQLSubModel):
predicate=lambda obj, data: True, predicate=lambda obj, data: True,
modifier=lambda obj, data: None, modifier=lambda obj, data: None,
data={}): data={}):
if predicate(self, data):
modifier(self, data)
for p in self._profiles: for p in self._profiles:
p._data_traversal(predicate, modifier, data) p._data_traversal(predicate, modifier, data)

View File

@ -19,7 +19,7 @@
import os import os
import logging import logging
from tools import logger_exception from tools import logger_exception, timer, flatten
from Model.Tools.PamhyrDB import SQLSubModel from Model.Tools.PamhyrDB import SQLSubModel
@ -225,10 +225,13 @@ class Scenario(SQLSubModel):
return aux(self, []) return aux(self, [])
def drop_deleted_data(self, execute): @timer
def clean_deleted_data(self, execute):
tables = self.tables_with_deleted_column tables = self.tables_with_deleted_column
branch = self.get_parent_branch() branch = self.get_parent_branch()
all_ids = []
for table in tables: for table in tables:
if self.parent is None: if self.parent is None:
# This scenario is the default scenario, so we can # This scenario is the default scenario, so we can
@ -257,17 +260,23 @@ class Scenario(SQLSubModel):
if ids is None or len(ids) == 0: if ids is None or len(ids) == 0:
continue continue
ids = flatten(ids)
logger.debug( logger.debug(
f"(s{self.id}) Drop deleted data into '{table}' : {ids}" f"({self.name}) Drop deleted data into '{table}' : {ids}"
) )
execute( execute(
f"DELETE FROM {table} " + f"DELETE FROM {table} " +
f"WHERE scenario = {self.id} " + f"WHERE scenario = {self.id} " +
"AND pamhyr_id IN " + "AND pamhyr_id IN " +
f"({', '.join(map(lambda x: str(x[0]), ids))})" f"({', '.join(map(str, ids))})"
) )
all_ids += ids
return all_ids
@property @property
def id(self): def id(self):
return self._id return self._id

View File

@ -24,12 +24,15 @@ from datetime import datetime
from tools import timer, timestamp from tools import timer, timestamp
from functools import reduce from functools import reduce
from Model.Tools.PamhyrListExt import PamhyrModelList
from Model.Tools.PamhyrDict import PamhyrModelDict
from Model.Tools.PamhyrDB import SQLModel from Model.Tools.PamhyrDB import SQLModel
from Model.Scenarios import Scenarios from Model.Scenarios import Scenarios
from Model.Scenario import Scenario from Model.Scenario import Scenario
from Model.Status import StudyStatus from Model.Status import StudyStatus
from Model.Except import NotImplementedMethodeError from Model.Except import NotImplementedMethodeError
from Model.River import River from Model.River import River
from Model.Geometry.Reach import Reach
from Checker.Study import * from Checker.Study import *
@ -450,14 +453,48 @@ class Study(SQLModel):
data=progress data=progress
) )
# Clear DB for each scenarios # Clear DB for current scenario
for scenar in self.scenarios.lst: ids = self.status.scenario.clean_deleted_data(self.execute)
scenar.drop_deleted_data(self.execute) self.memory_clean(ids)
progress() progress()
self.commit() self.commit()
@timer
def memory_clean(self, ids):
list_classes = set(PamhyrModelList.__subclasses__())
dict_classes = set(PamhyrModelDict.__subclasses__())
reach_class = Reach
def modifier(obj, data):
t = type(obj)
if t in list_classes:
obj._lst = list(
filter(
lambda el: el.id not in ids,
obj._lst
)
)
elif t in dict_classes:
new = {}
for key in obj._dict:
if obj._dict[key].id not in ids:
new[key] = obj._dict[key]
obj._dict = new
elif t is reach_class:
obj._profiles = list(
filter(
lambda el: el.id not in ids,
obj._profiles
)
)
self.river._data_traversal(
lambda o, d: True, modifier, {}
)
def sql_save_request_count(self, *args, **kargs): def sql_save_request_count(self, *args, **kargs):
return self._count() return self._count()

View File

@ -97,6 +97,9 @@ class PamhyrModelDict(SQLSubModel):
Nothing Nothing
""" """
if predicate(self, data):
modifier(self, data)
for key in self._dict: for key in self._dict:
self._dict[key]\ self._dict[key]\
._data_traversal(predicate, modifier, data) ._data_traversal(predicate, modifier, data)

View File

@ -100,6 +100,9 @@ class PamhyrModelList(SQLSubModel):
Nothing Nothing
""" """
if predicate(self, data):
modifier(self, data)
for el in self._lst: for el in self._lst:
el._data_traversal(predicate, modifier, data) el._data_traversal(predicate, modifier, data)

View File

@ -107,6 +107,9 @@ class PamhyrModelList(SQLSubModel):
Returns: Returns:
Nothing Nothing
""" """
if predicate(self, data):
modifier(self, data)
for el in self._lst: for el in self._lst:
el._data_traversal(predicate, modifier, data) el._data_traversal(predicate, modifier, data)