如何在金字塔框架内的请求之间缓存/记忆熊猫数据帧(昂贵的计算)


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"的结果。我想这样做,以便在片刻或几小时后再次需要这些结果时,计算和检索不需要再次发生。

天真地,我尝试将输出结果放入金字塔框架内的会话对象中。这不起作用,因为熊猫数据帧太大了......(可能还有其他问题(。

那么我该怎么做呢?

[有关其他上下文:我正在计算熊猫数据帧中的一些值。然后,我将在jquery DataTable中呈现整个表。我使用前端来查找选定的行。我正在发回所选行的列表。现在,我想转到数据帧中的这些行,并从该数据帧中获取信息以保存到数据库中。

您需要定义某种可以在请求之间共享的同步数据存储。如果这不是外部的东西(redis,memcache,rdbms等(,那么你可能会问一个带锁的内存存储。您可以将此类存储附加到registry并从每个请求访问它。您有责任了解此处的线程问题并适当锁定存储,以便 2 个或更多请求不会同时更新存储。

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

作为旁注,我不知道 pandas 中的数据帧是否是线程安全的,但我敢打赌它们不是,所以你需要通过序列化为更原始的形式然后反序列化为每个请求的新数据帧来以某种方式解决这个问题。

最新更新