2017-02-14 1 views
0
class FindHits(object): 

    def __init__(self, a, b): 
     self.a = a 
     self.b = b 

    def calculate_hits(): 
     # Some expensive calculation using arguments self.a, and self.b 
     df = pd.DataFrame() 
     return df 

J'ai une classe qui calcule quelques hits. Le processus de calcul et de récupération de données est plutôt coûteux. Donc, pour un ensemble donné de paramètres, je veux conserver les résultats de "calculate_hits". Je veux le faire de sorte que lorsque ces résultats sont à nouveau nécessaires quelques instants ou quelques heures plus tard, les calculs et la récupération n'ont pas besoin de se reproduire. Naïvement, j'ai essayé de mettre les résultats de sortie dans l'objet de session dans le framework Pyramid. Cela n'a pas fonctionné parce que les pandas Dataframe sont trop gros ... (Et il pourrait y avoir d'autres problèmes aussi).Comment puis-je mettre en cache/mémoize un DataFrame pandas (calcul coûteux) entre des demandes dans le framework Pyramid?

Alors, comment faire?

[Pour un contexte supplémentaire: Je calcule certaines valeurs dans une base de données pandas. Je présente ensuite la table entière dans un DataTable jquery. J'utilise le front-end pour trouver les lignes sélectionnées. Je renvoie une liste de lignes sélectionnées. Maintenant, je veux aller à ces lignes dans la base de données et prendre des informations de cette base de données pour enregistrer dans une base de données.)

Répondre

1

Vous devez définir un type de magasin de données synchronisé qui peut être partagé entre les demandes. Si ce n'est pas quelque chose d'externe (redis, memcache, rdbms, ...) alors vous posez probablement des questions sur un magasin en mémoire avec des verrous. Vous pouvez attacher un tel magasin au registry et y accéder à partir de chaque requête. Il est de votre responsabilité d'être conscient des problèmes de threads ici et de verrouiller le magasin de manière appropriée de sorte que 2 demandes ou plus ne mettent pas à jour le magasin à la fois.

def main(...): 
    config.registry.mystore = {'frame': pd.DataFrame()} 

def view(request): 
    frame = request.registry.mystore['frame'] 

Comme une note de côté, je ne sais pas si les trames de données en pandas sont thread-safe, mais je serais prêt à parier qu'ils ne sont pas, vous aurez donc besoin de répondre à cette sérialisation en quelque sorte par un plus forme primitive, puis désérialisation à une nouvelle trame de données par requête.