-
Notifications
You must be signed in to change notification settings - Fork 31
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Optimisations pour la carte GTFS nationale #3122
Conversation
#{sql} | ||
""" | ||
|
||
# TODO: replace this by cleaner solutions (https://dba.stackexchange.com/a/208599) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Au final c'est une solution classique de ce que j'ai compris. Je collerai ça dans une méthode à part.
{zoom_level, {_sx, _sy}} = find_closest_zoom_level({snap_x, snap_y}) | ||
|
||
# TODO: skip create earlier if exist | ||
create_gtfs_stops_materialized_view(zoom_level) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pour l'instant, je lazy-create les vues, ce qui permet d'être sûr qu'elle sera là. On pourra garder ça mais en plus, s'assurer que c'est rafraichi la nuit.
@@ -99,13 +201,5 @@ defmodule Transport.GTFSData do | |||
c: selected_as(fragment("count"), :count) | |||
}) | |||
|> where([e], e.count > 0) | |||
|> DB.Repo.all() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Le code ci-dessous prenait du temps, il en prend moins quand le calcul est décalé dans Postgres, ce que j'ai fait.
conn | ||
|> put_resp_content_type("application/json") | ||
|> render("gtfs_stops_data.json", | ||
data: {:skip_json_encoding, Jason.encode!(%{type: "clustered", data: Jason.Fragment.new(data)})} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Le "fragment" permet de ne pas ré-encoder une partie, mais que la globalité de l'encode soit quand même un JSON valide.
|
||
def create_gtfs_stops_materialized_view(zoom_level) | ||
when is_integer(zoom_level) and zoom_level in 1..12 do | ||
{:ok, %{rows: [[count]], num_rows: 1}} = |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code qui vérifie si la vue matérialisée existe déjà. Sera refactoré plus proprement dans #3136.
Ecto.Adapters.SQL.query(DB.Repo, """ | ||
select count(*) | ||
from pg_matviews | ||
where matviewname = 'gtfs_stops_clusters_level_#{zoom_level}' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pas d'injection SQL tant que le paramètre est bien un entier!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(mais je remplacerai ça par une query Ecto propre)
@AntoineAugusti j'ai répondu à tes commentaires mais surtout nourri #3136 pour la suite. Prêt pour déploiement quand tu voudras. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Merci pour le boulot effectué 🗺️
Dans cette PR je travaille à optimiser le rendu de la carte GTFS nationale, de façon à pouvoir la rendre publique (performance suffisante pour ne pas faire planter le reste du size).
Démo disponible sur http://prochainement.transport.data.gouv.fr/explore/gtfs-stops
Périmètre
Je ne cherche pas à rendre la carte publique tout de suite, mais déjà à nettement améliorer sa performance en interne.
Pour l'instant la piste de travail est une mise sous cache des clusters par zoom level, avec des materialized views correspondantes.
Je crée les vues à la volée sans chercher à les invalider en cas de changement pour le moment.
Je m'appuie sur la base de données pour générer le JSON, ce qui est plus rapide.
J'ai testé avec différentes tailles d'écran et ça semble rendre correct.
Points à améliorer
Vérification de la taille des caches
EDIT: après récupération d'un backup de production le 9 mai et ajout de zoom-levels: