Ceci est mon code pour itérer sur " ListOfDocuments " qui est une liste de plus de 500 000 condamnations. Chacun de ces dicts a environ 30 paires clé-valeur dont j'ai besoin.

    for document in ListOfDocuments:
        for field in document:
            if(field=="USELESS"):
                continue
            ExtraList[AllParameters[field]] = document[field]
        ExtraList[AllParameters["C_Name"]] = filename.split(".")[0]
        AppendingDataframe.loc[len(AppendingDataframe)] = ExtraList

Ce que j'essaie de faire, c'est de stocker tous les noms de colonnes possibles dans AllParameters , de parcourir le ListOfDocuments puis de parcourir le dict obtenu, puis d'itérer chaque paire clé-valeur et de les enregistrer dans ExtraList que j'ajoute enfin dans le AppendingDataframe.

Cette approche est extrêmement lente, même sur les machines les plus puissantes et je sais que ce n'est pas la bonne façon de le faire. Toute aide serait très appréciée.

Modifier: Un exemple de document ressemble à une valeur-clé normale avec plus de 30 clés.

Par exemple

{'FKey': 12, 'Skey': 22, 'NConfig': 'NA', 'SCHEMA': 'CD123 ...}

Et j'aimerais extraire et stocker les paires clé-valeur individuelles.

0
Jackdaw 19 mars 2019 à 15:21

2 réponses

Meilleure réponse

Faites des fils. Vous pouvez savoir combien de fichiers vous devez parcourir et éventuellement le diviser en 4 threads. Cela accélérera le processus car il permettra la lecture simultanée des documents

Vous pouvez commencer par créer une méthode qui accepte une liste de fichiers, puis les parcourir. Ensuite, vous pouvez passer quelques sections de la liste principale à la méthode et les exécuter dans des threads. Cela devrait fournir une augmentation décente de la vitesse

4
marc_s 20 mars 2019 à 17:16

Vous pouvez l'implémenter en implémentant une fonction qui traite une seule entrée de la liste, puis utilisez le multitraitement:

import multiprocessing as multi
from multiprocessing import Manager

manager = Manager()

data = manager.list([])

def func(a):          #Implement here the function 
    data.append(a)    #that processes one dict from the list

p = multi.Pool(processes=16)
p.map(func, ListOfDocuments)

print data
1
Istvan 19 mars 2019 à 13:33