Breakout Sélectif par Dictionnaire
Innovation : Développée par Assietou DIAGNE (ANSD, Sénégal) et validée en production lors du RGPH5 Sénégal.
Qu'est-ce que le Breakout Sélectif ?
Le breakout sélectif permet de traiter un seul dictionnaire CSPro au lieu de tous les dictionnaires simultanément.
Approche Sélective vs Globale
Traitement Global (Mode Standard)
- Traite tous les dictionnaires ensemble dans un seul processus
- Durée : Heures voire jours selon le volume
- Traitement séquentiel en cascade
- Commande :
php bin/console csweb:process-cases
Traitement Sélectif (Innovation CSWeb Community)
- Traite un seul dictionnaire à la fois
- Durée : Minutes par dictionnaire
- Isolation complète : Un échec n'affecte que le dictionnaire en cours
- Indépendance : Les autres dictionnaires sont traités normalement
- Flexibilité : Choisir quel dictionnaire traiter et quand
- Commande :
php bin/console csweb:process-cases-by-dict NOM_DICT
Validation Production RGPH5 Sénégal
Le breakout sélectif a été validé en production lors du RGPH5 Sénégal, permettant un traitement ciblé par dictionnaire avec une flexibilité accrue pour gérer les opérations de recensement.
Cas d'Usage : Traitement Multi-Dictionnaires
Imaginons 5 dictionnaires :
- RECENSEMENT (dictionnaire principal, très volumineux)
- ENQUETE_MENAGES (volume moyen)
- EVALUATION_AGRICOLE (volume moyen)
- SONDAGE_SANTE (volume modéré)
- TEST_PILOTE (petit volume de test)
Avec Traitement Global :
php bin/console csweb:process-cases
# Processus séquentiel :
# 1. RECENSEMENT (3M) → démarre
# 2. Erreur à 80% (ex: timeout, problème technique)
# 3. Le processus s'arrête en cascade
# 4. Les dictionnaires suivants ne sont pas traités
# 5. Il faut corriger le problème et tout relancerAvec Breakout Sélectif :
# 1. Test rapide du pilote
php bin/console csweb:process-cases-by-dict TEST_PILOTE
# ✓ 30 secondes - Succès
# 2. Traiter ENQUETE_MENAGES
php bin/console csweb:process-cases-by-dict ENQUETE_MENAGES
# ✓ 45 minutes - Succès
# 3. Traiter RECENSEMENT
php bin/console csweb:process-cases-by-dict RECENSEMENT
# ✗ Erreur à 80% (timeout)
# Impact : UNIQUEMENT RECENSEMENT bloqué
# Les autres (TEST_PILOTE, ENQUETE) restent intacts et utilisables
# 4. Continuer avec les autres (pas bloqués!)
php bin/console csweb:process-cases-by-dict EVALUATION_AGRICOLE
# ✓ 25 minutes - Succès
php bin/console csweb:process-cases-by-dict SONDAGE_SANTE
# ✓ 15 minutes - Succès
# Résultat : 4/5 dictionnaires breakés et utilisables
# Flexibilité : Corriger RECENSEMENT sans impacter les autresInstallation
Prérequis
- CSWeb Community Platform v2.0 installé
- PostgreSQL 12+ ou MySQL 8+
- Au moins 1 dictionnaire CSPro uploadé
Configuration .env
# Mode breakout
BREAKOUT_MODE=local # ou remote
BREAKOUT_DB_TYPE=postgresql # ou mysql, sqlserver
# PostgreSQL (Recommandé)
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DATABASE=csweb_analytics
POSTGRES_USER=csweb_user
POSTGRES_PASSWORD=SecurePassword123!Vérification
# Vérifier drivers
php bin/console csweb:check-database-drivers
# Lister dictionnaires disponibles
php bin/console csweb:list-dictionariesUtilisation
Commande de Base
php bin/console csweb:process-cases-by-dict <NOM_DICTIONNAIRE>Options Utiles
| Option | Description | Exemple |
|---|---|---|
--limit=N | Limiter à N cases (test) | --limit=100 |
--dict-id=ID | Utiliser l'ID au lieu du nom | --dict-id=3 |
--verbose | Logs détaillés | -vvv |
Exemples
Breakout Simple
docker compose exec csweb php bin/console \
csweb:process-cases-by-dict EVAL_PRODUCTEURS
# Sortie:
# [1/6] Nettoyage schéma... (2s)
# [2/6] Création tables... (5s)
# [3/6] Extraction cases... (125 trouvées)
# [4/6] Transformation... (18s)
# [5/6] Insertion PostgreSQL... (125 lignes)
# [6/6] Création index... (3s)
# ✓ Breakout terminé : 29 secondesTest avec Limite
# Tester avec 10 cases seulement
php bin/console csweb:process-cases-by-dict RGPH5_MENAGES --limit=10Breakout Automatique (Cron)
# Crontab : breakout quotidien à 2h
0 2 * * * docker compose exec -T csweb \
php bin/console csweb:process-cases-by-dict EVAL_PROD \
--no-interaction >> /var/log/breakout.log 2>&1Architecture
Nomenclature des Tables
Pattern : {label_dictionnaire}_{nom_table}
Exemple : Dictionnaire EVAL_PRODUCTEURS_USAID
Label généré: eval_producteurs
Tables créées:
- eval_producteurs_cases
- eval_producteurs_notes
- eval_producteurs_producteurs (Level 1)
- eval_producteurs_observations (Level 2)
- eval_producteurs_photos (Level 3)Schéma PostgreSQL
Database: csweb_analytics
-- Dictionnaire 1
eval_producteurs_cases
eval_producteurs_producteurs
...
-- Dictionnaire 2
rgph5_menages_cases
rgph5_menages_individus
...Cas d'Usage Réels
RGPH5 Sénégal (ANSD)
Contexte
- Plusieurs milliers de questionnaires
- SQL Server 2022
Configuration
BREAKOUT_MODE=remote
BREAKOUT_DB_TYPE=sqlserverRésultat
- Traitement flexible et ciblé par dictionnaire
- Intégration Power BI pour analyses temps réel
Institut National de Statistique
Workflow
# 1. Test pilote (petit volume)
php bin/console csweb:process-cases-by-dict PILOTE_2026
# 2. Enquête (volume moyen)
php bin/console csweb:process-cases-by-dict ENQUETE_MENAGES
# 3. Recensement (gros volume)
php bin/console csweb:process-cases-by-dict RECENSEMENT_POPAvantages
- Test rapide sans attendre
- Flexibilité totale
- Isolation des échecs
Performance
Caractéristiques de Performance
Le breakout sélectif offre un traitement ciblé avec plusieurs avantages :
Avantages principaux :
- Temps de traitement proportionnel au dictionnaire ciblé
- Charge mémoire réduite (traitement d'un seul dictionnaire)
- Isolation des échecs (chaque dictionnaire est indépendant)
- Possibilité de paralléliser sur plusieurs dictionnaires
- Optimisation I/O par dictionnaire
Optimisations
-- Créer indexes après breakout
CREATE INDEX idx_cases_key
ON eval_producteurs_cases(key);
CREATE INDEX idx_cases_verified
ON eval_producteurs_cases(verified);Dépannage
Dictionary Not Found
# Lister tous les dictionnaires
php bin/console csweb:list-dictionaries
# Utiliser le nom EXACT
php bin/console csweb:process-cases-by-dict EVAL_PRODUCTEURS_USAIDConnection Failed
# Vérifier services
docker compose ps
# Tester connexions
php bin/console csweb:check-database-drivers --test-connections
# Redémarrer si nécessaire
docker compose restart postgresPerformance Lente
# Optimiser PostgreSQL
vim /etc/postgresql/16/main/postgresql.conf
# Augmenter buffers
shared_buffers = 4GB
work_mem = 50MB
maintenance_work_mem = 1GB
# Redémarrer
sudo systemctl restart postgresqlCrédits
- Innovation : Assietou DIAGNE (ANSD, Sénégal) - siatou.sissi@gmail.com
- Validation Production : RGPH5 Sénégal, INS Gambie, INS Guinée
- Intégration CSWeb Community : Bouna DRAME - Portfolio (opens in a new tab)