J'ai l'intention de télécharger un milliard d'enregistrements prises de ~750 fichiers (chaque ~250 MO) pour un db à l'aide de l'ORM de django. Actuellement, chaque fichier ~20min à traiter, et je me demandais si il existe un moyen d'accélérer ce processus.
J'ai pris les mesures suivantes:
- Utiliser @transaction.commit_manually et de s'engager une fois tous les 5000 enregistrements
- Set DEBUG=False afin que django ne pas accumuler toutes les commandes sql dans la mémoire
- La boucle qui s'exécute sur des enregistrements dans un fichier unique est entièrement contenue dans une seule fonction (minimiser les modifications de pile)
- S'est abstenu de frapper la base de données pour les requêtes (utilisé un local de hachage des objets déjà dans la base de données au lieu d'utiliser get_or_create)
- Ensemble force_insert=True dans la save() dans l'espoir qu'il permettra d'économiser de django, un peu de logique
- Définir explicitement l'id dans l'espoir qu'il permettra d'économiser de django, un peu de logique
- Général le code de réduction et d'optimisation
Que puis-je faire pour accélérer les choses? Voici quelques-unes de mes pensées:
- Utiliser une sorte de compilateur Python ou version qui est plus rapide (Psyco?)
- Remplacer l'ORM et l'utilisation de SQL directement
- Utiliser certaines 3ème partie du code qui pourrait être mieux (1, 2)
- Prie le django de la communauté pour créer un bulk_insert fonction
Tous les pointeurs au sujet de ces articles ou de tout autre idée serait la bienvenue :)