我如何在金字塔框架内的请求之间 cache/memoize 一个 pandas DataFrame(昂贵的计算)?

How do I cache/memoize a pandas DataFrame (expensive calculation) between requests within the Pyramid framework?

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

我有一个 class 可以计算一些匹配。计算和数据检索过程相当昂贵。所以对于给定的一组参数,我想持久化 "calculate_hits" 的结果。我想这样做,以便在片刻或几小时后再次需要这些结果时,不需要再次进行计算和检索。

天真地,我尝试将输出结果放入金字塔框架内的会话对象中。这没有用,因为 pandas Dataframe 太大了......(而且可能还有其他问题)。

那我该怎么做呢?

[有关其他上下文:我正在计算 pandas 数据框中的一些值。然后,我将在 jquery 数据表中显示整个 table。我使用前端来查找选定的行。我正在发回选定行的列表。现在我想转到 Dataframe 中的那些行并从该 DataFrame 中获取信息以保存到数据库中。)

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

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

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

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