Commit e8737e7d authored by Lionel's avatar Lionel
Browse files

Ajout paramètre optionnel pour controler le nombre d'etapes exécutees en parallele

parent 489b10b2
......@@ -2,7 +2,12 @@
Ce repo contient l'application python crater-data, qui permet de générer l'ensemble des données utilisées par CRATer sous forme de fichiers csv.
Les instructions ci-dessous sont valables pour linux et mac.
Pour contribuer :
* Voir la [liste des tâches](https://framagit.org/groups/lga/-/issues)
* Consulter également les [pratiques de développement et règles de codage du projet](https://framagit.org/lga/crater-ui/-/blob/develop/pratiques-de-developpement.md)
Les instructions ci-dessous décrivent comment installer et utiliser crater-data. Elles sont valables pour linux et mac.
## 1) Installer de l'environnement de développement
......
import argparse
from multiprocessing import Pool
from typing import Callable
from crater.cartographie.calculateur_cartographie import calculer_cartes
from crater.crater_logger import log
......@@ -33,7 +35,7 @@ from crater.territoires.calculateur_referentiel_territoires import charger_refer
calculer_referentiel_territoires
def lancer_calcul_surface_agricole_utile():
def lancer_calcul_surface_agricole_utile(nombre_traitements_paralleles: int):
referentiel_territoires = charger_referentiel_territoires(
CHEMIN_OUTPUT_DATA / DOSSIER_TERRITOIRES
)
......@@ -51,16 +53,22 @@ def lancer_calcul_surface_agricole_utile():
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_RPG,
NOMS_FICHIERS_RPG,
CHEMIN_OUTPUT_DATA / DOSSIER_SURFACE_AGRICOLE_UTILE,
2
nombre_traitements_paralleles
)
def lancer_etape_crater(etape: Callable):
log.info(f"#### DEBUT DE L'ETAPE {etape.__name__} ####")
etape()
log.info(f"#### FIN DE L'ETAPE {etape.__name__} ####")
def lancer_calcul_complet_referentiel_crater():
def lancer_calcul_complet_traitement_crater(nombre_traitements_paralleles: int):
lancer_calcul_territoires()
lancer_calcul_population_agricole()
lancer_calcul_politique_fonciere()
lancer_calcul_pratiques_agricoles()
lancer_calcul_production_besoins()
etapes_parallelisables = [lancer_calcul_population_agricole, lancer_calcul_politique_fonciere, lancer_calcul_pratiques_agricoles, lancer_calcul_production_besoins]
with Pool(processes=nombre_traitements_paralleles) as pool:
pool.map(lancer_etape_crater, etapes_parallelisables)
lancer_calcul_cartes()
......@@ -173,7 +181,7 @@ def lancer_calcul_cartes():
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser = argparse.ArgumentParser(usage='%(prog)s ETAPE_CALCUL\n'
parser = argparse.ArgumentParser(usage='%(prog)s [OPTIONS] ETAPE_CALCUL\n'
+ 'Permet de lancer une étape ou un groupe d\'étapes de traitements de crater-data\n'
+ "Valeurs possible pour ETAPE_CALCUL :\n"
+ "\tparcel-besoins-assiette-actuelle\tgénérer le fichier des besoins en SAU à partir de l'api PARCEL, pour l'assiette actuelle\n"
......@@ -188,6 +196,10 @@ if __name__ == '__main__':
+ "\tcrater-pratiques-agricoles\t\tgénérer les fichiers résultat crater-data, pour l'axe pratiques agricoles\n"
+ "\tcrater-production-besoins\t\tgénérer les fichiers résultat crater-data, pour l'axe production-besoins\n"
+ "\tcrater-cartes\t\t\t\tgénérer les fichiers geojson contenant les contours géographiques des territoires et certains indicateurs\n"
+ "\n"
+ "Valeurs possible pour OPTIONS :\n"
+ "\t-p=NB_TRAITEMENTS_PARALLELLES\t\t Permet de paralléliser certaines étapes de calcul pour réduire le durée totale du traitement. Il est conseillé d'utiliser pour NB_TRAITEMENTS_PARALLELLES une valeur correspondant au nombre de coeurs physiques sur la machine qui exécute le traitement (par ex -p=4 sur une machine à 4 coeurs physiques et 8 coeurs logiques). Par défaut la valeur est à 1 (=pas de parallélisation)\n"
)
parser.add_argument("ETAPE_CALCUL",
help="Nom de l'étape à exécuter",
......@@ -205,8 +217,11 @@ if __name__ == '__main__':
'crater-cartes'
])
parser.add_argument("-p", action="store", default=1, type=int)
args = parser.parse_args()
nombre_traitements_paralleles = args.p
if (args.ETAPE_CALCUL == 'parcel-besoins-assiette-actuelle'):
log.info(
"Génération du fichier des besoins SAUs pour les territoires à partir de l'API PARCEL, assiette actuelle")
......@@ -244,10 +259,10 @@ if __name__ == '__main__':
)
elif (args.ETAPE_CALCUL == 'sau-calculer-surfaces'):
log.info("Génération des fichiers résultats CRATER des surfaces agricoles utiles")
lancer_calcul_surface_agricole_utile()
lancer_calcul_surface_agricole_utile(nombre_traitements_paralleles)
elif (args.ETAPE_CALCUL == 'crater-complet'):
log.info("Génération des fichiers résultats CRATER")
lancer_calcul_complet_referentiel_crater()
lancer_calcul_complet_traitement_crater(nombre_traitements_paralleles)
elif (args.ETAPE_CALCUL == 'crater-territoires'):
log.info("Génération des fichiers résultats CRATER pour les territoires")
lancer_calcul_territoires()
......
......@@ -5,7 +5,7 @@ import time
import datetime
FORMATTER = logging.Formatter("%(asctime)s — %(name)s — %(levelname)s — %(message)s")
FORMATTER = logging.Formatter("%(asctime)s — %(name)s — %(levelname)s — [%(processName)s] : %(message)s")
NOM_FICHIER_LOG_DEFAULT = "crater_data.log"
......
......@@ -19,7 +19,7 @@ def calculer_surface_agricole_utile_par_commune_et_culture(
dossier_rpg: Path,
noms_fichiers_rpg: List[str],
chemin_dossier_output: Path,
nombre_traitements_paralleles: int = 1
nombre_traitements_paralleles: int
) -> None:
log.info("##### CALCUL SURFACES AGRICOLES PAR COMMUNE ET CULTURE #####")
......
......@@ -29,7 +29,8 @@ class TestSurfaceAgricoleUtile(unittest.TestCase):
communes_sig,
CHEMIN_INPUT_DATA / DOSSIER_RPG,
NOMS_FICHIERS_RPG_INPUT,
CHEMIN_OUTPUT_DATA / DOSSIER_SURFACE_AGRICOLE_UTILE
CHEMIN_OUTPUT_DATA / DOSSIER_SURFACE_AGRICOLE_UTILE,
1
)
assert_csv_files_are_equals(
CHEMIN_EXPECTED_DATA / DOSSIER_SURFACE_AGRICOLE_UTILE / 'sau_par_commune_et_culture' / 'sau_rpg_communes_R-53.csv',
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment