2017-02-14 16 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 

我有一个计算一些命中的类。计算和数据检索过程相当昂贵。所以对于给定的一组参数,我想保留“calculate_hits”的结果。我想这样做,以便当这些结果在几分钟或几小时后再次需要时,计算和检索不需要再次发生。天真地,我试着把输出结果放入金字塔框架内的会话对象中。这不起作用,因为熊猫数据框太大了...(并且可能还有其他问题)。如何在Pyramid框架内的请求之间缓存/记忆一个pandas DataFrame(昂贵的计算)?

那么我该如何做到这一点?

[有关其他上下文:我正在计算熊猫数据框中的某些值。然后我将整个表格呈现在一个jQuery DataTable中。我使用前端查找选定的行。我发回选定行的列表。现在,我想去在数据帧的那些行,并从该数据帧需要的信息保存到数据库中。)

回答

1

您需要定义某种可以跨请求共享同步的数据存储。如果这不是外部的东西(redis,memcache,rdbms,...),那么您可能会询问关于锁的内存存储。您可以将这样的店的registry,并从每个请求访问它。您有责任了解这里的线程问题并适当锁定商店,以便2个或更多请求不会一次更新商店。

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

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

作为一个方面说明,我不知道,如果在大熊猫数据帧是线程安全的,但我敢打赌,他们都没有,所以你需要通过序列化到更解决,不知怎的原始形态,然后反序列化到每个请求一个新的数据帧。

相关问题