我如何在金字塔框架内的请求之间 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 但我敢打赌它们不是,所以你需要通过某种方式解决这个问题序列化为更原始的形式,然后根据请求反序列化为新的数据帧。
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 但我敢打赌它们不是,所以你需要通过某种方式解决这个问题序列化为更原始的形式,然后根据请求反序列化为新的数据帧。