Comments on: Importer des données, retour d’expérience http://sametmax.com/importer-des-donnees-retour-dexperience/ Du code, du cul Sat, 07 Nov 2015 11:08:18 +0000 hourly 1 http://wordpress.org/?v=4.1 By: Sam http://sametmax.com/importer-des-donnees-retour-dexperience/#comment-18830 Wed, 22 Jan 2014 18:57:55 +0000 http://sametmax.com/?p=8772#comment-18830 Idée noire de franquin ?

]]>
By: Réchèr http://sametmax.com/importer-des-donnees-retour-dexperience/#comment-18819 Wed, 22 Jan 2014 12:07:05 +0000 http://sametmax.com/?p=8772#comment-18819 Si un jour vous faites un article sur l’idempotence, voici une image sympa qui pourrait illustrer le propos. (surtout la dernière case).

http://3.bp.blogspot.com/-BRTDh6M-WxM/URzAwbrIh0I/AAAAAAAACIA/91HsYg-04S0/s1600/franquin-idees-noires.guillotine.jpg

]]>
By: mentat http://sametmax.com/importer-des-donnees-retour-dexperience/#comment-18656 Sat, 18 Jan 2014 11:19:22 +0000 http://sametmax.com/?p=8772#comment-18656 D’accord avec TOUS les points cités.
J’ajouterais que j’utilise des générateurs que j’enchaine :
on lit une ligne | on traite/nettoie les données | on l’insère

Comme un pipe sous un shell unix
On décompose bien les traitements comme cela. Les tests peuvent être enchainés et ajouter/enlever très facilement.

Et les performances sont top

]]>
By: Sam http://sametmax.com/importer-des-donnees-retour-dexperience/#comment-18643 Fri, 17 Jan 2014 14:39:07 +0000 http://sametmax.com/?p=8772#comment-18643 C’est vrai, mais il faut faire attention à ce que le code d’import ne soit pas exécuté dans la même VM qu’un autre projet, sinon les exceptions seront toutes logguées. Un tips très utile cela dit.

]]>
By: Maxime L. http://sametmax.com/importer-des-donnees-retour-dexperience/#comment-18641 Fri, 17 Jan 2014 14:11:30 +0000 http://sametmax.com/?p=8772#comment-18641 Si je peux apporter ma pierre à l’édifice… En référence à ce paragraphe :

Mettez aussi un gros try / except générique qui loggue toute exception, pour pouvoir faire un debug post mortem. Idéalement, faites le dumper locals() et envoyez-vous un mail d’alerte. Vous ne voulez pas que le script ne tourne pas pendant une journée sans que vous le sachiez.

Pour la gestion des exceptions, je changerai carrément le hook de base de Python.

import sys
 
def myexcepthook(type, value, tb):
    import traceback
    from email.mime.text import MIMEText
    from subprocess import Popen, PIPE
    tbtext = ''.join(traceback.format_exception(type, value, tb))
    msg = MIMEText("There was a problem with your program:\n\n" + tbtext)
    msg["From"] = "root+importer@domain.com"
    msg["To"] = "admin@domain.com"
    msg["Subject"] = "[Sam&Max Importer] Crash report (Exception raised)"
    p = Popen(["/usr/sbin/sendmail", "-t"], stdin=PIPE)
    p.communicate(msg.as_string())
 
 
    reload()  # relaunch the importer if possible
 
sys.excepthook = myexcepthook

Ainsi, un mail est envoyé dès qu’une exception n’est pas géré dans le code (donc ça équivaut à un gros try/except), il exécute cette fonction. C’est plus propre et plus maintenable à mon goût :-)

Référence StackOverflow de la réponse qui m’a inspiré

]]>
By: Recher http://sametmax.com/importer-des-donnees-retour-dexperience/#comment-18638 Fri, 17 Jan 2014 10:53:59 +0000 http://sametmax.com/?p=8772#comment-18638 Pour les références externes, on a parfois besoin de faire une “memoization” / “lazy evaluation” (je ne sais pas quel serait le terme exact).

Exemple : on doit lire plusieurs milliards de ligne de données, dont l’un des champs est une valeur numérique : “id_position_sexuelle” (plusieurs lignes peuvent avoir la même valeur). Pour connaître le nom de la position correspondante, on doit interroger un serveur externe. Mais ce serveur est vilain, il ne donne qu’un seul nom à la fois, à partir de l’id qu’on lui envoie, et il ne peut pas donner le nombre total de position existante. On ne peut donc pas pré-récupérer tout les noms de positions pour les mettre en cache.

Dans ce cas, à chaque fois qu’on trouve un id inconnu dans les données à lire, on interroge le serveur externe, et on enregistre le nom dans un fichier en local. Plus tard, si on retombe sur le même id, pas besoin de réinterroger le serveur.

]]>
By: Luigi http://sametmax.com/importer-des-donnees-retour-dexperience/#comment-18637 Fri, 17 Jan 2014 07:14:11 +0000 http://sametmax.com/?p=8772#comment-18637 Très pertinent, comme d’habitude.

]]>
By: Stéphane http://sametmax.com/importer-des-donnees-retour-dexperience/#comment-18634 Thu, 16 Jan 2014 23:44:13 +0000 http://sametmax.com/?p=8772#comment-18634 Les remarques de maître Capello :

Ellispis -> Ellipsis

dans la mauvais langue -> dans la mauvaise langue

si on peut processer la donnée -> si on peut traiter la donnée (?)

LEUR système n’escape pas -> LEUR système ne protège pas

une query de plus -> une requête supplémentaire

ajoutez les indexes -> ajoutez les index

]]>
By: bobby http://sametmax.com/importer-des-donnees-retour-dexperience/#comment-18632 Thu, 16 Jan 2014 21:45:22 +0000 http://sametmax.com/?p=8772#comment-18632 En gros, on fait un gros MapReduce…

]]>
By: Fred http://sametmax.com/importer-des-donnees-retour-dexperience/#comment-18630 Thu, 16 Jan 2014 19:24:47 +0000 http://sametmax.com/?p=8772#comment-18630 Moi, pour l’import, c’est super facile

def import():
    try:
        ... (open... read... insert into...)... # Bref ici tout le code d'import
    except:
        pass
    print("Import terminé, tout est ok"
# import()
]]>