Import performance
Super-experimental, peut-être plus une démo qu’un draft, mais je voulais le sortir de mon cerveau et en parler ici. Pour l’import de la BNLC, on passe de 25 minutes (hahaha) à une quinzaine de secondes. Ce qui prend énormément de temps, c’est pas l’import en lui-même, mais le rendu des rows un par un. Dans les trucs testés ici:
- plutôt que des hooks after_create, avec pour chaque row un render, un turbo_operation, et un stream, on prend les rows créés à la fin de la transation, on génère tout le html, et on ne fait qu’un seul (gros) stream turbo.
- de même, on n’envoie qu’un seul `notify_geometry_changed pour le layer.
- on désactive le lookup redis pour le cache (c’est des nouveaux rows)
- ça, on ne pourra pas complètement s’en passer, mais: en principe, on peut faire un multi-fetch redis plutôt que de tester chaque row un par un.
- surtout, dans chaque
Row#render
on fait un appel àreload_with_fields_values
, donc en fait une belle N+1. Avec un grand N.
Le point 4 est sans doute corrigeable indépendamment du reste, et c’est à vue de nez le plus lourd. Pour 1 et 2, il faut faire une réarchitecture pour utiliser les résultats des transactions plutôt que les hooks. Le point 2 est sans doute pertinent quand même.
refs #196 #306, fixes #248 (closed)
Edited by Nicolas Bouilleaud