Skip to content
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

Merged
merged 24 commits into from
May 10, 2023
Merged

Optimisations pour la carte GTFS nationale #3122

merged 24 commits into from
May 10, 2023

Conversation

thbar
Copy link
Contributor

@thbar thbar commented May 2, 2023

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

  • Réduire les étapes de traitement côté Elixir, car c'est ce qui prend le plus de temps à présent. Il y a des conversions / arrondis vers flottants qui prennent pas mal de temps. Éventuellement l'encodage vers le JSON
  • Trouver comment remettre en place la clé "type" pour différencier ce qui est en dessous
  • Déplacer les points restants dans un nouveau ticket pour pouvoir shipper ça - ok voir [Epic] Améliorations carte GTFS nationale #3136

Vérification de la taille des caches

select schemaname as table_schema,
    relname as table_name,
    pg_size_pretty(pg_total_relation_size(relid)) as total_size,
    pg_size_pretty(pg_relation_size(relid)) as data_size,
    pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid))
      as external_size
from pg_catalog.pg_statio_user_tables
where relname like 'gtfs_stops_clusters_level%'
order by pg_total_relation_size(relid) desc,
         pg_relation_size(relid) desc
limit 20;

EDIT: après récupération d'un backup de production le 9 mai et ajout de zoom-levels:

table_schema table_name total_size data_size external_size
public gtfs_stops_clusters_level_12 11 MB 11 MB 32 kB
public gtfs_stops_clusters_level_11 9080 kB 9048 kB 32 kB
public gtfs_stops_clusters_level_10 6472 kB 6440 kB 32 kB
public gtfs_stops_clusters_level_9 4176 kB 4144 kB 32 kB
public gtfs_stops_clusters_level_8 2384 kB 2352 kB 32 kB
public gtfs_stops_clusters_level_7 1096 kB 1064 kB 32 kB
public gtfs_stops_clusters_level_6 456 kB 424 kB 32 kB
public gtfs_stops_clusters_level_5 208 kB 176 kB 32 kB
public gtfs_stops_clusters_level_4 120 kB 88 kB 32 kB
public gtfs_stops_clusters_level_3 40 kB 40 kB 0 bytes
public gtfs_stops_clusters_level_2 24 kB 24 kB 0 bytes
public gtfs_stops_clusters_level_1 8192 bytes 8192 bytes 0 bytes

#{sql}
"""

# TODO: replace this by cleaner solutions (https://dba.stackexchange.com/a/208599)
Copy link
Contributor Author

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)
Copy link
Contributor Author

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()
Copy link
Contributor Author

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)})}
Copy link
Contributor Author

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}} =
Copy link
Contributor Author

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}'
Copy link
Contributor Author

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!

Copy link
Contributor Author

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)

@thbar thbar changed the title [WIP] Optimisations pour la carte GTFS nationale Optimisations pour la carte GTFS nationale May 9, 2023
@thbar thbar marked this pull request as ready for review May 9, 2023 16:16
@thbar thbar requested a review from a team as a code owner May 9, 2023 16:16
@thbar thbar enabled auto-merge May 10, 2023 08:45
@thbar
Copy link
Contributor Author

thbar commented May 10, 2023

@AntoineAugusti j'ai répondu à tes commentaires mais surtout nourri #3136 pour la suite. Prêt pour déploiement quand tu voudras.

Copy link
Member

@AntoineAugusti AntoineAugusti left a 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é 🗺️

@thbar thbar added this pull request to the merge queue May 10, 2023
Merged via the queue into master with commit 0f45a51 May 10, 2023
@thbar thbar deleted the public-gtfs-map branch May 10, 2023 09:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants