From f9d83ac68cc980891791acfb3f190a477d41998f Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Thu, 21 May 2026 11:16:31 +0200 Subject: [PATCH] Scenario: Add memory clean for Pamhyr list, dict and reaches. --- src/Model/Geometry/Reach.py | 3 +++ src/Model/Scenario.py | 17 ++++++++++--- src/Model/Study.py | 43 +++++++++++++++++++++++++++++--- src/Model/Tools/PamhyrDict.py | 3 +++ src/Model/Tools/PamhyrList.py | 3 +++ src/Model/Tools/PamhyrListExt.py | 3 +++ 6 files changed, 65 insertions(+), 7 deletions(-) diff --git a/src/Model/Geometry/Reach.py b/src/Model/Geometry/Reach.py index 318adcb8..2516c75a 100644 --- a/src/Model/Geometry/Reach.py +++ b/src/Model/Geometry/Reach.py @@ -103,6 +103,9 @@ class Reach(SQLSubModel): predicate=lambda obj, data: True, modifier=lambda obj, data: None, data={}): + if predicate(self, data): + modifier(self, data) + for p in self._profiles: p._data_traversal(predicate, modifier, data) diff --git a/src/Model/Scenario.py b/src/Model/Scenario.py index 1bcf38b2..cc4c01f4 100644 --- a/src/Model/Scenario.py +++ b/src/Model/Scenario.py @@ -19,7 +19,7 @@ import os import logging -from tools import logger_exception +from tools import logger_exception, timer, flatten from Model.Tools.PamhyrDB import SQLSubModel @@ -225,10 +225,13 @@ class Scenario(SQLSubModel): return aux(self, []) - def drop_deleted_data(self, execute): + @timer + def clean_deleted_data(self, execute): tables = self.tables_with_deleted_column branch = self.get_parent_branch() + all_ids = [] + for table in tables: if self.parent is None: # This scenario is the default scenario, so we can @@ -257,17 +260,23 @@ class Scenario(SQLSubModel): if ids is None or len(ids) == 0: continue + ids = flatten(ids) + logger.debug( - f"(s{self.id}) Drop deleted data into '{table}' : {ids}" + f"({self.name}) Drop deleted data into '{table}' : {ids}" ) execute( f"DELETE FROM {table} " + f"WHERE scenario = {self.id} " + "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 def id(self): return self._id diff --git a/src/Model/Study.py b/src/Model/Study.py index 2ec031a7..522ef7fb 100644 --- a/src/Model/Study.py +++ b/src/Model/Study.py @@ -24,12 +24,15 @@ from datetime import datetime from tools import timer, timestamp from functools import reduce +from Model.Tools.PamhyrListExt import PamhyrModelList +from Model.Tools.PamhyrDict import PamhyrModelDict from Model.Tools.PamhyrDB import SQLModel from Model.Scenarios import Scenarios from Model.Scenario import Scenario from Model.Status import StudyStatus from Model.Except import NotImplementedMethodeError from Model.River import River +from Model.Geometry.Reach import Reach from Checker.Study import * @@ -450,14 +453,48 @@ class Study(SQLModel): data=progress ) - # Clear DB for each scenarios - for scenar in self.scenarios.lst: - scenar.drop_deleted_data(self.execute) + # Clear DB for current scenario + ids = self.status.scenario.clean_deleted_data(self.execute) + self.memory_clean(ids) progress() 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): return self._count() diff --git a/src/Model/Tools/PamhyrDict.py b/src/Model/Tools/PamhyrDict.py index 52ac2e3b..7bddc1c8 100644 --- a/src/Model/Tools/PamhyrDict.py +++ b/src/Model/Tools/PamhyrDict.py @@ -97,6 +97,9 @@ class PamhyrModelDict(SQLSubModel): Nothing """ + if predicate(self, data): + modifier(self, data) + for key in self._dict: self._dict[key]\ ._data_traversal(predicate, modifier, data) diff --git a/src/Model/Tools/PamhyrList.py b/src/Model/Tools/PamhyrList.py index 5d735443..a97f869a 100644 --- a/src/Model/Tools/PamhyrList.py +++ b/src/Model/Tools/PamhyrList.py @@ -100,6 +100,9 @@ class PamhyrModelList(SQLSubModel): Nothing """ + if predicate(self, data): + modifier(self, data) + for el in self._lst: el._data_traversal(predicate, modifier, data) diff --git a/src/Model/Tools/PamhyrListExt.py b/src/Model/Tools/PamhyrListExt.py index 07d0ed58..187d437f 100644 --- a/src/Model/Tools/PamhyrListExt.py +++ b/src/Model/Tools/PamhyrListExt.py @@ -107,6 +107,9 @@ class PamhyrModelList(SQLSubModel): Returns: Nothing """ + if predicate(self, data): + modifier(self, data) + for el in self._lst: el._data_traversal(predicate, modifier, data)