Project

General

Profile

Documentation #26331

Faire passer le message comme quoi le connecteur CSV n'est pas approprié pour des fichiers avec des dizaines de milliers de lignes

Added by Frédéric Péters 7 months ago. Updated about 2 months ago.

Status:
Nouveau
Priority:
Normal
Assignee:
-
Target version:
-
Start date:
12 Sep 2018
Due date:
% Done:

0%

Patch proposed:
No
Planning:
No

Description

Parce qu'actuellement c'est parfois utilisé ainsi et c'est n'importe quoi et il faudrait le dire.

History

#1 Updated by Mikaël Ates 7 months ago

Il arrive que soit fournis des fichiers tableurs conséquents par certaines sources, https://www.data.gouv.fr/fr/datasets/liste-et-adresses-des-etablissements-scolaires/ par exemple.

Quelles sont les alternatives ? Est-ce que si ces données étaient dans un JSON Data Store ce serait plus rapide ? Est-il envisageable d'alimenter un JDS à partir d'un fichier CSV ?

#2 Updated by Thomas Noël 7 months ago

Je pense que ce n'est pas tant une question de performance (aujourd'hui les csv sont interprétés et stockés en base) qu'une question de stabilité de la source. Une incohérence ou inconsistance dans un CSV ça arrive très vite, et boum. Alors sur des dizaines de milliers de lignes, c'est pire.

Mon avis : pour les données qui viennent de https://www.data.gouv.fr comme celles qui viennent de api.gouv.fr, on devrait avoir des connecteurs «dédiés» et proposés par défaut, un peu comme pour la BAN.

#4 Updated by Benjamin Dauvergne about 2 months ago

On peut aussi s'auto-suggérer que c'est la loose de ne pas savoir gérer une liste de 36000 trucs en 2019 correctement (dans le sens où on maintiendrait un dico en RAM avec deux dicos d'index et ça marcherait); en Django 1.11 on devrait facilement s'en sortir avec un JSONField indexé. Un plan pourrait être d'importer la couche de compatibilité JSONField d'authentic et de l'utiliser, puis quand on détecter django>1.11 d'ajouter une déclaration d'index à TableRow:

class Meta:
    if DJ111:
        indexes = [
            django.contrib.postgres.indexes.GinIndex(fields=('data',')),
        ]

ça c'est la partie facile, ensuite il faudra voir pour détecter les filtres simples du style code_postal == query.get('code_postal') pour en faire des TableRow.objects.filter(data__xxx=query.get('blabla')), ça peut dans un premier n'être qu'une regex, pour le cas 99% qui nous intéresse (je cherche un code postal).

#5 Updated by Benjamin Dauvergne about 2 months ago

Bien sûr ça n'empêche pas d'avoir aussi des connecteurs spécifiques du style liste des écoles et des codes postaux aussi bien sûr (mais plus pour des questions de simplicité à trouver/mettre en place que pour les performances, j'espère).

Also available in: Atom PDF