2017-10-09 14 views
0

Lecture d'un fichier et construction de dictionnaires par ligne lue.SQLAlchemy insérer la liste des dictionnaires par lots

Dans une boucle pour im en annexe à une liste de ces dictionnaires, lorsque le len(list) est plus grand à 10K, j'envoie la liste à con.execute(add.insert(list)) et nettoyer la liste. Le problème est que la dernière liste de dictionnaires n'est pas un 10K donc je manque d'insérer le dernier lot.

Je ne pense pas que la construction d'une grande liste de dictionnaires et leur migration en mémoire, puis leur itération sur la liste seraient une façon performante de gérer cela.

Existe-t-il une méthode dans SQLAlchemy où je viens d'envoyer les dictionnaires et de définir la limite de taille de la taille de lot afin qu'elle gère la charge par elle-même? Ou une autre solution ...

chunks.append(data_dict) 
    if len(chunks) == 10000: 
     con.execute(add.insert(chunks)) 
     del chunks[:] 

.newb slqalchemy apprenant

Répondre

1

Pour une solution naïve, vous pouvez profiter du fait que vous pouvez accéder à la dernière variable dans une boucle en dehors de la boucle. Ajout de quelques autres tweaks je pense que cela va fonctionner:

for counter, data_dict in enumerate(data_dict_list): 
    chunks.append(data_dict) 
    if counter % 10000 == 0 and counter != 0: 
     con.execute(add.insert(chunks)) 
     chunks = [] 
con.execute(add.insert(chunks)) 

Si vous voulez profiter de plus SQLAlchemy dispose cette page docs a un exemple d'un insert en vrac suivant un schéma similaire:

http://docs.sqlalchemy.org/en/latest/faq/performance.html#i-m-inserting-400-000-rows-with-the-orm-and-it-s-really-slow

+0

Merci ACV cela a aidé - avec quelques modifications mineures, il semble stable maintenant. –

+0

Boa, valeu @JorgeVidinha;) – ACV

+0

:-) Ohoh foi joia mesmo. Valeu obrigado. –